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

Regex 这个带有两个文件的AWK关联数组是如何工作的?,regex,awk,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

我写这篇文章的目的是要求解释这个短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
到底做什么?我知道它分别代表记录数=当前输入文件的记录数,但为什么代码需要这样操作?当我从命令中删除它时,结果与粘贴测试文件\u long.txt测试文件\u short.txt相同。2) 对于a中的
$2,作为此处语法的一部分,AWK是否自动从文件2中读取字段2?3) 我只想确认一下
;“下一步”
只是指跳过所有其他块并转到下一行?换句话说,代码首先对每一行执行
a[$2]
,然后返回并对每一行执行其他块?当我删除
时;下一步
我仍然会得到过滤后的输出,但只会得到
测试文件\u short.txt的完整打印输出


感谢所有的投入,我的目标是更好地理解AWK的工作原理,因为它对我当前的工作(处理大型基因组数据集)非常有用。

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

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

  • 一个
中的
$2将只对文件号2执行,这是由于第一条规则中的
下一条
语句造成的。由于此
next
语句,文件号1永远不会达到第二条规则


学会克服单直线电机狂热。将其转换为适当的文件,然后为感兴趣的内容添加打印语句。否则请仔细阅读。好luc,哦,你是说“下一个”是指“下一个文件”?不,它的意思是跳过程序中的以下所有规则。因此,它实际上将从当前文件中的下一行开始。好的,一旦它遍历了当前文件的所有行,它将只执行第二个文件中“next”之后的块?另外,我还不清楚NR==FNR行,这有什么用?@isoscelesheel是的,这是正确的。条件
NR==FNR
确保第一条规则只对第一个文件执行。谢谢,您的评论非常有用!