这个带两个文件的AWK关联数组如何工作?

时间:2014-04-22 21:49:02

标签: regex awk

我写信要求解释这个简短的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 个答案:

答案 0 :(得分:2)

以下是与您的代码相关的一些信息:

  • NR==FNR仅对第一个文件有效。因为,对于文件编号2,FNR将从1开始,而NR继续增加。

  • $2 in a仅对文件号2执行,这是由于第一条规则中的next语句。由于此next语句,文件号1永远不会达到第二条规则。