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的示例之一。
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
,zsh
或bash
)。