我写信要求解释这个简短的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的工作原理,因为它对我当前的工作(处理大型基因组数据集)非常有用。
答案 0 :(得分:2)
以下是与您的代码相关的一些信息:
NR==FNR
仅对第一个文件有效。因为,对于文件编号2,FNR
将从1开始,而NR
继续增加。
$2 in a
仅对文件号2执行,这是由于第一条规则中的next
语句。由于此next
语句,文件号1永远不会达到第二条规则。