Unix 如何使用AWK根据两个文件之间的公共字段删除一个文件上的重复行?
我有两个文件Unix 如何使用AWK根据两个文件之间的公共字段删除一个文件上的重复行?,unix,awk,Unix,Awk,我有两个文件 文件1包含3个字段 文件2包含4个字段 文件1的行数远小于文件2的行数 我想用以下操作比较基于第1个字段的两个文件 如果文件1任何一行的第一个字段出现在文件2中某一行的第一个字段中,则不要为文件2打印该行 任何建议都将不胜感激 Input File 1 S13109 3739 31082 S45002 3800 31873 S43722 3313 26638 Input File 2 S13109 3738 31081 0 S13109 3737 31080
Input File 1
S13109 3739 31082
S45002 3800 31873
S43722 3313 26638
Input File 2
S13109 3738 31081 0
S13109 3737 31080 0
S00033 3008 29985 0
S00033 3007 29984 0
S00022 4130 31838 0
S00022 4129 31837 0
S00188 3317 27372 0
S45002 3759 31832 0
S45002 3758 31831 0
S45002 3757 31830 0
S43722 3020 26345 0
S43722 3019 26344 0
S00371 3737 33636 0
S00371 3736 33635 0
Desired Output
S00033 3008 29985 0
S00033 3007 29984 0
S00022 4130 31838 0
S00022 4129 31837 0
S00188 3317 27372 0
S00371 3737 33636 0
S00371 3736 33635 0
awk'FNR==NR{a[$1]++;next}![$1]'文件1文件2
工作原理:
FNR==NR
当您有两个(或更多)输入文件要awk时,NR
将在下一个文件的第一行重置回1,而FNR
将从其停止处继续递增。通过检查FNR==NR
我们实际上是在检查当前是否正在解析第一个文件
a[$1]++
如果我们正在解析第一个文件(见上文),则创建一个关联数组,其中第一个字段$1
作为键,并将值增加1。这本质上让我们可以创建一个“可见”列表
next
此命令告诉awk不要处理任何进一步的命令,并读入下一条记录并重新开始。之所以这样做,是因为file1仅用于设置关联数组
!a[$1]
这一行仅在
FNR==NR
为false时执行,即我们不分析文件1,因此必须分析文件2。然后,我们使用file2的第一个字段$1
作为索引键,索引到前面创建的“seed”列表中。如果返回的值为0,则表示我们没有在文件1中看到它,因此应打印此行。相反,如果该值不是零,那么我们在file1中确实看到了它,因此不应该打印它的值。请注意,![$1]
相当于!一个[$1]{print}
,因为没有给出的默认操作是打印整行。如果不需要保留行的顺序,可以在Bash、Korn shell或Z shell中使用进程替换以及连接
和排序
实用程序:
join -v 2 <(sort file_1) <(sort file_2)
join-v2亲爱的SiegeX。你的解释对我这样的初学者很有启发性。我写这种脚本的问题是,有很多方法可以完成相同的任务,但很难达到最佳的方法。我想这是有经验的。非常感谢您的帮助。FNR将为每个文件重新初始化。NR不断增加。