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

Rah*_*ana 9 awk shell-script text-processing join

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

文件#1:

118D FC300_R5_TP  FX.B      32775       2112   6       2038   6       2112   0
118E FC300_R5_TP  FX.B      32775       2136   7       2065   6       2136   0
118F FC300_R5_TP  FX.B      32775       2124   6       2064   6       2124   0
1190 FC300_R5_TP  FX.B     819210     814632  99     814609  99     814632   0
1191 FC300_R5_TP  FX.B     819210     104100  13     103714  13     104100   0
1192 FC300_R5_TP  FX.B    1638420    1609476  98    1609402  98    1609476   0
1196 FC300_R5_TP  FX.B    1638420    1638432 100    1638379 100    1638432   0
119A FC300_R5_TP  FX.B    3276840    3271776 100    3271698 100    3271776   0
119E FC300_R5_TP  FX.B    3276840    3264120 100    3264034 100    3264120   0
11A2 FC300_R5_TP  FX.B    3276840    2328648  71    2328546  71    2328648   0
11A6 FC300_R5_TP  FX.B    3276840    2328444  71    2328355  71    2328444   0
11AA FC300_R5_TP  FX.B    3276840    2328528  71    2328403  71    2328528   0
11AE FC300_R5_TP  FX.B    3276840    2328648  71    2328468  71    2328648   0
11B2 FC300_R5_TP  FX.B    3276840    2130000  65    2129766  65    2130000   0
173A FC300_R5_TP  FX.B    6553680    6478572  99    6477747  99    6478572   0
Run Code Online (Sandbox Code Playgroud)

文件#2:

11AA FC300_R5_TP  FX.B    3276840    2328528  71    2328403  71    2328528   0
11AE FC300_R5_TP  FX.B    3276840    2328648  71    2328468  71    2328648   0
11B2 FC300_R5_TP  FX.B    3276840    2130000  65    2129766  65    2130000   0
173A FC300_R5_TP  FX.B    6553680    6478572  99    6477747  99    6478572   0
0BDB FC600_R5_TP  FX.B   33554640    6044364  18    6033105  18    6044364   0
0BDC FC600_R5_TP  FX.B   33554640    6613536  20    6481974  19    6613536   0
0BDD FC600_R5_TP  FX.B   33554640    4435848  13    4057170  12    4435848   0
0BDE FC600_R5_TP  FX.B   33554640    6620868  20    6249518  19    6620868   0
Run Code Online (Sandbox Code Playgroud)

期望输出

文件#3:

0BDB FC600_R5_TP  FX.B   33554640    6044364  18    6033105  18    6044364   0
0BDC FC600_R5_TP  FX.B   33554640    6613536  20    6481974  19    6613536   0
0BDD FC600_R5_TP  FX.B   33554640    4435848  13    4057170  12    4435848   0
0BDE FC600_R5_TP  FX.B   33554640    6620868  20    6249518  19    6620868   0
Run Code Online (Sandbox Code Playgroud)

我想使用它们的第一列比较文件 1 和文件 2,并从文件 2 中删除它们在文件 1 中匹配的整个行或行。我还想将结果保存到第三个文件,文件 #3。

jas*_*yan 10

您可以awk为此使用:

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

解释:

  • FNR == NR: 当记录数等于文件中的记录数时,此测试为真。这仅适用于第一个文件,因为第二个文件NR将等于 file1 + 的行数FNR

  • a[$1]: 创建file1第一个字段的数组元素索引。

  • next: 跳到下一条记录,因此不再对文件 1 进行处理。

  • !($1 in a): 查看数组中是否存在第一个字段($1),即在file1 中,并打印整行(到file3)。

基于来自#awk wiki的示例之一。


Sté*_*las 8

export LC_ALL=C
comm -13 <(sort f1) <(sort  f2)
Run Code Online (Sandbox Code Playgroud)

将报告仅在f2.

export LC_ALL=C
join -v2 <(sort f1) <(sort f2)
Run Code Online (Sandbox Code Playgroud)

会将f2其第一个字段的行报告为f1.

(您需要一个支持进程替换的外壳,例如ksh93,zshbash)。