【问题标题】:Breakdown of one line of code involving awk涉及awk的一行代码分解
【发布时间】:2019-11-27 15:05:30
【问题描述】:

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

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

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

另外,我是新手,所以任何可以指导我回答的资源都会非常有帮助。谢谢。

【问题讨论】:

  • 那不比较行。它只比较第一列。

标签: awk


【解决方案1】:

在此重复以供参考,以防问题被编辑:

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”,具体取决于第一列中的值是否在数组中。

【讨论】:

  • 非常感谢!我一定会阅读 awk 的基础知识。
【解决方案2】:

这就是这个 awk 的意思:

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

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

【讨论】:

  • 非常感谢!这就是我一直在寻找的。​​span>
猜你喜欢
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多