我目前正在从事一个项目,该项目涉及比较来自两个不同文件的数据。我一直在寻找将file1的每一行与file2的每一行进行比较的命令,如果匹配则打印出“ 1”,如果不匹配则打印出“ 0”。然后,它将对file1的每一行重复该命令,用于file1的第二行。
我在网上找到了这段代码,这似乎对我的项目有用,但是我希望有人能帮我分解一下代码,并提供更多的解释。
awk 'FNR==NR{a[$1]; next} {print $1, ($1 in a) ? "1":"0"}' file1.txt file2.txt
此外,我对此并不陌生,因此任何可能指导我回答问题的资源都将非常有帮助。谢谢。
答案 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
FNR
与正在处理的总记录号NR
执行{a[$1]; next}
块相同。我们可以安全地假设,如果此条件为true,则我们正在处理第一个文件。 {a[$1]; next}
将第一列作为键添加到名为a
的数组中,然后转到下一行而不处理任何awk脚本。在第一个文件被完全处理之后,我们将在第一个文件的第一列中找到一个数组,其中包含每个不同值的键。 {print $1, ($1 in a) ? "1":"0"}
因为我们现在必须在第二个文件上,所以我们正在打印遇到的每行/每条记录。在这里,我们打印第一列,然后,如果该列的值作为键在数组中,则打印1
,否则打印0
。 简而言之,这将打印第二个文件的每个第一列,并说明该列是否也存在于第一个文件中,并显示1或0。