使用 Awk 或类似工具从多个文件中删除重复项

Remove Duplicates from Multiple files with Awk or similar

我有多个长度不同的 2 列制表符分隔文件,我想在其中消除 ALL 文件中常见的重复值。

例如:

文件 1:

9   1975
1518    a
5   a.m.
16  able
299 about
8   above
5   access

文件 2:

6   a
6   abandoned
140 abby
37  able
388 about
17  above
6   accident

文件 3:

5   10
8   99
23  1992
7   2002
29  237th
11  60s
8   77th
2175    a
5   a.m.
6   abandoned
32  able
370 about

文件 4:

5   911
1699    a
19  able
311 about
21  above
6   abuse

期望的结果是将 第 2 列ALL 文件共有的项目从每个文件中删除。期望的结果如下:

文件 1:

9   1975
5   a.m.
16  able
8   above
5   access

文件 2:

6   abandoned
140 abby
37  able
17  above
6   accident

文件 3:

5   10
8   99
23  1992
7   2002
29  237th
11  60s
8   77th
5   a.m.
6   abandoned
32  able

文件 4:

5   911
19  able
21  above
6   abuse

一些查找重复值的标准方法不适用于此任务,因为我试图查找与多个文件重复的那些值。 因此,commsort/uniq 之类的内容对于此任务无效。 是否有某种类型的 awk 或其他类型的递归工具可用于实现我想要的结果?

虽然我还没有测试过,但这应该可以解决问题。 这将创建扩展名为“.new”的文件。

awk '{a[]++;b[]=[=10=];c[]=FILENAME}
      END{
          for(i in a){if(a[i]==1)print b[i]>c[i]".new"}
      }' file1 file2 file3 file4

如果您不能在一个文件中重复 $2s,类似这样的东西(未经测试)将起作用:

awk '
FNR==1 {
    if (seen[FILENAME]++) {
        firstPass = 0
        outfile = FILENAME "_new"
    }
    else {
        firstPass = 1
        numFiles++
        ARGV[ARGC++] = FILENAME
    }
}
firstPass { count[]++; next }
count[] != numFiles { print > outfile }
' file1 file2 file3 file4

如果您可以在一个文件中复制 $2s,则只需在每个文件中第一次出现 $2 时才增加计数 [$2],例如

firstPass { if (!seen[FILENAME,]++) count[]++; next }