使用 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
一些查找重复值的标准方法不适用于此任务,因为我试图查找与多个文件重复的那些值。
因此,comm
或 sort/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 }
我有多个长度不同的 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
一些查找重复值的标准方法不适用于此任务,因为我试图查找与多个文件重复的那些值。
因此,comm
或 sort/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 }