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)
但它并不是仅基于第一列进行比较。相反,它正在比较整行。
请帮忙。
这是一个著名的 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 '!seen[$1]++ || NR==FNR' file1 file2 > file3
Run Code Online (Sandbox Code Playgroud)