将两个文件与第一列进行比较,并从shell脚本中删除第二个文件中的重复行

时间:2014-10-17 14:47:16

标签: shell unix

我会以一个例子问我的问题。我有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

3 个答案:

答案 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

但是,根据需要,比较不仅仅基于第一列,而是基于整行。