仅基于第一列比较两个文件,并从shell脚本中删除第二个文件中的重复行

时间:2014-11-17 18:30:38

标签: shell unix awk compare

我会以一个例子问我的问题。我有2个文件:

档案#1

002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000

档案#2

002901998 752986KFK NTR974MTS 0990000
002948998 752986QAQ NTR974VTS 0000000
002901998 752986KFK NTR974MTJ 0990000

期望的输出:

002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000    
002901998 752986KFK NTR974MTS 0990000

注意:行之间没有间隙(输入)。

我想使用第一列比较文件1和文件2,如果它们在文件1中匹配,则从文件2中删除整行。我还想将结果保存到第一个文件或新文件,文件#3,包含文件1和文件2中的所有条目(没有文件2中的重复项)。请在shell脚本中建议一个好的解决方案。

目前我正在使用:

awk 'FNR==NR {a[$1];print;next} !($1 in a)' file1 file2 > file3

但它不仅仅基于第一列进行比较。相反,它正在比较整行。

请帮忙。

2 个答案:

答案 0 :(得分:4)

这是一个着名的awh成语:仅在第一次看到第一个字段时打印一行:

awk '!seen[$1]++' file1 file2 > file3
002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000

这取决于:

  • awk将未设置的数组元素视为零
  • 后增量返回变量的当前值
  • “true”条件的默认操作是打印行

保留第一个文件中的所有行,同时删除第二个文件中的重复

awk '!seen[$1]++ || NR==FNR' file1 file2 > file3

答案 1 :(得分:0)

也许:

cp file1 file3;
grep -Fv "$(cut -f 1 -d ' ' < file1)" file2 >> file3