逐行比较两个文件的单列

时间:2015-04-01 20:27:32

标签: arrays bash awk

我之前曾向此问过类似的问题,但没有找到我想要的确切答案,我为冗余道歉。我决定重新发布不同的问题。我有两个冗长的文件,每个文件有两个用空格分隔的列。

我希望消除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到输出行:

  1. 第1列出现在fileA
  2. 但fileB中的第2列是不同的

    awk 'FNR==NR {a[$1]=$2; next} $1 in a && a[$1] != $2' fileA fileB
    
  3. 在我的代码遇到fileA和fileB之间的第2列中的第一个差异之前,这是有帮助的,然后代码输出所有后续行。

    而不是这个,我想将fileA的第2列的数组逐行比较到fileB的第2列。一旦代码遇到差异,它就会从fileB输出整个不匹配的行,然后将该数组的同一行与fileB的下一行进行比较。它继续比较阵列的同一行,输出fileB的差异行直到找到匹配。如果代码到达fileB的末尾并且未找到匹配项,则从fileA输出该行,移动到该数组的下一行并继续与fileB的每一行进行比较。这是否可行,或者比使用awk创建数组更容易?

1 个答案:

答案 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}}。