涉及awk的一行代码的细目分类

时间:2019-07-18 16:01:10

标签: awk

我目前正在从事一个项目,该项目涉及比较来自两个不同文件的数据。我一直在寻找将file1的每一行与file2的每一行进行比较的命令,如果匹配则打印出“ 1”,如果不匹配则打印出“ 0”。然后,它将对file1的每一行重复该命令,用于file1的第二行。

我在网上找到了这段代码,这似乎对我的项目有用,但是我希望有人能帮我分解一下代码,并提供更多的解释。

awk 'FNR==NR{a[$1]; next} {print $1, ($1 in a) ? "1":"0"}' file1.txt file2.txt

此外,我对此并不陌生,因此任何可能指导我回答问题的资源都将非常有帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

在此处出于参考的目的而重复,以防问题被编辑:

awk 'FNR==NR{a[$1]; next} {print $1, ($1 in a) ? "1":"0"}' file1.txt file2.txt

您应该首先真正阅读awk的基础入门。基本上,子句FNR==NR是检查我们是否正在读取第一个文件的常见用法。 NR是总记录号(行号),而FNR是当前文件中的记录号,因此当它们相等时,您仍在处理第一个文件。然后,该操作将第一列(而不是整行)存储到数组中。因此,该程序要做的第一件事是将第一个文件的第一列读入名为a的数组中。然后,它开始读取第二个文件,并打印每一行的第一列,然后根据第一列中的值是否在数组中,打印“ 1”或“ 0”。

答案 1 :(得分:0)

这是awk在说什么:

  awk 'FNR==NR{a[$1]; next} {print $1, ($1 in a) ? "1":"0"}' file1.txt file2.txt
  1. 如果正在处理的特定文件的记录号FNR与正在处理的总记录号NR执行{a[$1]; next}块相同。我们可以安全地假设,如果此条件为true,则我们正在处理第一个文件。
  2. {a[$1]; next}将第一列作为键添加到名为a的数组中,然后转到下一行而不处理任何awk脚本。在第一个文件被完全处理之后,我们将在第一个文件的第一列中找到一个数组,其中包含每个不同值的键。
  3. {print $1, ($1 in a) ? "1":"0"}因为我们现在必须在第二个文件上,所以我们正在打印遇到的每行/每条记录。在这里,我们打印第一列,然后,如果该列的值作为键在数组中,则打印1,否则打印0

简而言之,这将打印第二个文件的每个第一列,并说明该列是否也存在于第一个文件中,并显示1或0。