我会以一个例子问我的问题。我有2个文件:
档案#1
002948998 752986QAK NTR974VTS 0000000
102948932 752986QSC NTR974VTS 0000000
102948933 752986QSC NTR974VTS 0000000
档案#2
002948998 752986QAK NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000
期望的输出:
002948998 752986QAK NTR974VTS 0000000
102948932 752986QSC NTR974VTS 0000000
102948933 752986QSC NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000
注意:行之间没有间隙(输入)。
我想使用第一列比较文件1和文件2,如果文件2中的文件符合匹配,则从文件2中删除整行。我还想将结果保存到第一个文件或新文件,文件#3,其中包含文件1和文件2中的所有条目(没有文件2中的重复项)。请在shell脚本中建议一个好的解决方案。
目前我正在使用:
awk 'FNR==NR{a[$1];next};!($1 in a)' file1 file2 > file3
file3 >> file1
答案 0 :(得分:2)
这不符合您的要求吗?
cat file1 file2 | sort -u > file3
这会对输出进行排序,这可能不是您想要的,但将-u
(" unique")标记传递给sort
将导致它删除所有重复的行
如果复制仅在第一列中,则可以添加字段说明符:
cat file1 file2 | sort -u -k1,1 > file3
如果你有空行,你可以摆脱那些方式。通过grep .
管道整个事物,如果空行有空格,grep '[^ ]'
等等。
答案 1 :(得分:0)
你可以使用这个awk:
awk 'FNR==NR {a[$1];print;next} !($1 in a)' f1 f2 > file3
cat file3
002948998 752986QAK NTR974VTS 0000000
102948932 752986QSC NTR974VTS 0000000
102948933 752986QSC NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000
<强>解释强>
FNR==NR - Execute next block for 1st file only
a[$1] - Create an associative array with key as `$1` (first field)
print - prints entire row from 1st file
next - move to next row
!($1 in a) - Execute this block for 2nd file, it means print all rows from 2nd file when
`$1` is not in array `a`
答案 2 :(得分:0)
Simlilar对@Mark Reed的回答,但没有排序,你可以使用uniq
,就像那样:
cat file1 file2 | uniq --check-chars=9 > file3
它将con cat enate file1和file2,并将此并置提供给uniq
命令。此命令保留其输入的唯一行(通过仅保留第一次出现来删除重复项)。然后,输出存储在file3中。
--check-chars=9
仅检查每行的前9个字符是否有重复项。您可以在the man page of uniq中找到更多选项。
如果第一列不是固定长度(9),那么您可以使用:
cat file1 file2 | uniq > file3
但是,根据需要,比较不仅仅基于第一列,而是基于整行。