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

Rin*_*nku 1 unix shell awk compare

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

文件#1

002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000
Run Code Online (Sandbox Code Playgroud)

文件#2

002901998 752986KFK NTR974MTS 0990000
002948998 752986QAQ NTR974VTS 0000000
002901998 752986KFK NTR974MTJ 0990000
Run Code Online (Sandbox Code Playgroud)

期望的输出:

002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000    
002901998 752986KFK NTR974MTS 0990000
Run Code Online (Sandbox Code Playgroud)

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

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

目前我正在使用:

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

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

请帮忙。

gle*_*man 5

这是一个著名的 awk 习惯用法:仅当第一次看到第一个字段时才打印一行:

awk '!seen[$1]++' file1 file2 > file3
Run Code Online (Sandbox Code Playgroud)
002948998 752986QAK NTR974VTS 0000000    
102948932 752986QSC NTR974VTS 0000000    
102948933 752986QSC NTR974VTS 0000000
002901998 752986KFK NTR974MTS 0990000
Run Code Online (Sandbox Code Playgroud)

这依赖于:

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

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

awk '!seen[$1]++ || NR==FNR' file1 file2 > file3
Run Code Online (Sandbox Code Playgroud)