我之前曾向此问过类似的问题,但没有找到我想要的确切答案,我为冗余道歉。我决定重新发布不同的问题。我有两个冗长的文件,每个文件有两个用空格分隔的列。
我希望消除fileA和fileB中匹配第2列的所有行(无论行号/列1如何),并将整个不匹配行输出到单独的文件中。
档案A:
1 AA
2 BB
3 CC
4 DD
5 EE
6 FF
7 GG
8 HH
档案B:
1 AA
2 BB
3 XX
4 XX
5 CC
6 DD
7 XX
8 FF
9 GG
10 XX
11 XX
12 HH
期望的输出:
3 XX
4 XX
7 XX
5 EE
10 XX
11 XX
fedorqui建议我使用awk将第二列fileA存储在一个数组中,然后使用以下条件循环遍历fileB到输出行:
但fileB中的第2列是不同的
awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1] != $2' fileA fileB
在我的代码遇到fileA和fileB之间的第2列中的第一个差异之前,这是有帮助的,然后代码输出所有后续行。
而不是这个,我想将fileA的第2列的数组逐行比较到fileB的第2列。一旦代码遇到差异,它就会从fileB输出整个不匹配的行,然后将该数组的同一行与fileB的下一行进行比较。它继续比较阵列的同一行,输出fileB的差异行直到找到匹配。如果代码到达fileB的末尾并且未找到匹配项,则从fileA输出该行,移动到该数组的下一行并继续与fileB的每一行进行比较。这是否可行,或者比使用awk创建数组更容易?
答案 0 :(得分:1)
您可以使用此awk
:
awk 'NR==FNR {a[$2]=$0;next} $2 in a{del[$2];next} 1;
END{for (i in a) if (!(i in del)) print a[i]}' fileA fileB
3 XX
4 XX
7 XX
10 XX
11 XX
5 EE
注意订单不是问题,因为在(fileA - fileB)
遍历(fileB - fileA)
时计算fileB
时会打印{{1}}。