【问题标题】:how does this AWK associative array with two files work?这个带有两个文件的 AWK 关联数组是如何工作的?
【发布时间】: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。祝你好运,

标签: regex awk


【解决方案1】:

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

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

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

【讨论】:

  • 哦,你的意思是“下一个”是指“下一个文件”吗?
  • 不,意思是跳过程序中的以下所有规则。因此,它实际上会从当前文件的下一行开始。
  • 好的,一旦它遍历了当前文件的所有行,它就只执行第二个文件中“next”之后的块?另外,我还不清楚 NR==FNR 这条线,这有什么用?
  • @isosceleswheel 是的,这是正确的。条件NR==FNR 确保仅对第一个文件执行第一条规则。
  • 谢谢您,您的 cmets 非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 2021-04-28
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多