我对编写脚本和尝试在 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 函数最有可能成功,但我不确定如何让它发挥作用。谢谢!
最佳答案
此 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) 并打印该行或缺失的索引
关于macos - BASH 列表搜索 Awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24270231/