【问题标题】:BASH List Search AwkBASH 列表搜索 awk
【发布时间】:2014-08-07 20:16:26
【问题描述】:

我对编写脚本和尝试在 bash 中解决问题非常陌生。我有一个数据文件,其中包含如下所示的信息:

2   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
4   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1]   1 
8   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
10  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
12  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
14  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
16  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
18  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
20  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
24  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
26  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   
28  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
30  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1   
32  aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaaa.aaa    11111   aaaa    1111    [1] 1   

*a 代表各种字母,1 代表各种数字。

这些列表都应该从 2 到 32 以 2 为基础垂直下降,但是很多列表都缺少几个组件,例如我在上面发布的那个缺少 6 和 22。我正在尝试什么要做的是编写一个脚本,检查每个数字是否存在,如果没有,在前面添加一行数字,后面没有其他内容,这样你就有了:

2   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    
[1] 1   
4   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1]   1 
6

8   aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aa11_1.aaa aaaa.aaa 11111   aaaa    1111    [1] 1      
...

根据我的阅读,我相信 AWK 功能最有可能成功,但我不知道如何让它发挥作用。谢谢!

【问题讨论】:

  • 好吧,你必须不使用*'s 和.'s 作为你的数据示例,使用你提供的内容显示实际数据(数字、字母等)产生令人敬畏的回复,因为.* 都是正则表达式语法的一部分。解决问题,我将撤消我对您的问题的 -1
  • 我认为这似乎是一个完美的场景,只需逐行阅读并检查您所在的行是否以您期望的数字开头。这将是插入该行并将其写入某个临时文件的最简单方法。
  • 我很抱歉这是我的错误。但是,我认为我不能仅仅基于隐私问题发布实际数据。有没有更好的方法可以使用 * 来表示它们?这些时期实际上是数据集的一部分,所以我认为它们不需要更改。
  • @tmanion 这就是我们迄今为止所做的,但是有很多这些文件,为了加快这个过程,我的任务是试图找出一个脚本来自动化这个过程.
  • @ahmedmasud 希望更好!

标签: macos bash awk


【解决方案1】:

此 awk 基于 2-32(两个)条目的输出索引范围:

awk '{a[$1]=$0} END {for(i=2;i<=32;i+=2) print (i in a ? a[i] : i)}' data

细分:

  • 按索引将所有现有行存储在数组中
  • END,遍历所有已知索引 (2-32) 并打印该行或缺少的索引

【讨论】:

  • 很好,但你需要将它存储在内存中。
  • @klashxx - 是的,但这似乎完全可以接受最多 16 行。
  • 太棒了!唯一的问题是由于某种原因,它删除了除第一个数字之外的所有数字后面的尾随数据,并将最初的 2 变成了 32。关于如何解决这些问题的任何想法?
  • @user3735358 - 它对我来说很好,从问题中复制和粘贴数据。我会做一个可能对你有帮助的编辑,或者它可能是输入文件的格式。
  • 是的,格式肯定有问题,因为它现在可以正常工作了。非常感谢!
【解决方案2】:

试试类似的东西

awk '{
        while( $1 > last_printed + 2) { 
            last_printed+=2; 
            print last_printed;
        }
        print;
        last_printed = $1;
     }' FILENAME

【讨论】:

  • 所以这让一些非常奇怪的事情发生了,终端开始显示大量奇怪的、不断增加的数字。老实说,我不确定发生了什么,但发生了一些奇怪的事情
  • 糟糕,抱歉。我在 while 循环中有错误的条件。我已经修好了,现在应该可以了。
  • 出于某种原因,这仅显示列表的最后一行 (32),有什么想法吗?
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
相关资源
最近更新 更多