【发布时间】:2014-04-22 21:49:01
【问题描述】:
我写信要求解释这个简短的 AWK 命令的一些元素,我用它来打印 test-file_long.txt 中与输入 test-file_short.txt 中的字段匹配的字段。代码运行良好——我只想确切地知道程序在做什么,因为我对编程非常陌生,并且我希望能够在我的脚趾上思考我需要编写的未来命令。示例如下:
$ cat test-file_long.txt
2 41647 41647 A G
2 45895 45895 A G
2 45953 45953 T C
2 224919 224919 A G
2 230055 230055 C G
2 233239 233239 A G
2 234130 234130 T G
$ cat test-file_short.txt
2 41647 41647 A G
2 45895 45895 A G
2 FALSE 224919 A G
2 233239 233239 A G
2 234130 234130 T G
$ awk 'NR==FNR{a[$2];next}$2 in a{print $0,FNR}' test-file_short.txt test-file_long.txt
2 41647 41647 A G 1
2 45895 45895 A G 2
2 233239 233239 A G 6
2 234130 234130 T G 7
这是一个非常简单的匹配问题,几周前我在这个网站上找到了命令。我的问题是 1) NR==FNR 到底是做什么的?我知道它分别代表记录数=当前输入文件的记录数,但是为什么代码要运行呢?当我从命令中删除它时,结果与paste test-file_long.txt test-file_short.txt 相同。 2) 对于$2 in a,AWK 会自动从文件 2 中读取字段 2 作为此处语法的一部分吗? 3) 我只是想确认;next 只是意味着跳过所有其他块并转到下一行?所以换句话说,代码首先为每一行执行a[$2],然后返回并为每一行执行其他块?当我删除;next 时,我仍然会得到过滤后的输出,但只会跟踪test-file_short.txt 的完整打印输出。
感谢所有输入,我的目标只是更好地了解 AWK 的工作原理,因为它对我目前的工作(处理大型基因组数据集)非常有用。
【问题讨论】:
-
学会克服 1-liner 狂热。将其转换为适当的文件,然后为感兴趣的内容添加打印语句。否则请阅读grymoire.com/Unix/Awk.html。祝你好运,