我会以一个例子问我的问题。我有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
但它不仅仅基于第一列进行比较。相反,它正在比较整行。
请帮忙。
答案 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 '!seen[$1]++ || NR==FNR' file1 file2 > file3
答案 1 :(得分:0)
也许:
cp file1 file3;
grep -Fv "$(cut -f 1 -d ' ' < file1)" file2 >> file3