使用 awk 删除多个文件中同一列值的所有实例
Remove all instances of the same column value across multiple files using awk
我带着另一个 awk
问题回来了。
我有多个大文件,其中包含我要相互删除重复数据的数据。
假设我有以下一个月的数据:
fruit number rand
apple 12 342
taco 19 264
tortilla 2234 53423
tortillas 2 3431
apricot 13221 23424
apricots 24234 3252
pineapple 2342 2342
radish 1 3
下个月我收到此数据:
fruit number rand
pineapple 2 698
apple 34 472
taco 19 234
tortilla 16 58
tortillas 87 25
potato 234 2342
radish 1 55
grapes 9 572 422
apricot 13221 24
我想做的是获取第二个文件,并检查第一列的值以查看第一个文件中是否存在项目。如果是,我想从第二个文件中删除它们,只留下与第一个文件相关的第二个文件唯一的项目。
想要的结果会给我留下这样的东西:
fruit number rand DUPLICATE
pineapple 2 698 DUPE
apple 34 472 DUPE
taco 19 234 DUPE
tortilla 16 58 DUPE
tortillas 87 25 DUPE
potato 234 2342
radish 1 55 DUPE
grapes 9 572 422
apricot 13221 24 DUPE
或者,更明确地说:
fruit number rand
potato 234 2342
grapes 9 572 422
我正在想办法做到这一点而不必对文件进行排序。我试图将@karafka 的答案修改为 。我没有将同一个文件传递两次,而是尝试输入两个不同的文件。显然我做错了什么。
awk 'BEGIN { FS = OFS = " " }
NR==FNR {a[]++; next}
FNR==1 {print [=14=], "DUPLICATE"; next}
in a{if (a[]>1){print $(NF+1)="DUPE";delete a[]}}1' file{,}
我仍在学习 awk,非常感谢社区可以提供的任何帮助,但我会尝试解释我认为上述程序的作用。
- 第一行设置分隔符,输出分隔符为制表符。
- 此行读取第一个文件并存储一个数组,其中包含项目在列表中出现的次数。
- 这输出第一行,本质上是 header,在行中最后一项的末尾添加 "DUPLICATE"
- (这是我卡住的地方)如果在数组 "a" 中找到当前值,它应该检查存储的值是否大于 1。如果是,它应该在最后一列中打印单词 "DUPE"。最后它 returns 整行。
在测试文件中,我总是将所有标记为 "DUPE" 或什么都没有。
我也曾考虑过合并文件并以这种方式进行重复数据删除,但这会使我在第一个文件中留下不需要的 left-over 值。
我做错了什么?
我认为你做错的只是试图使用一堆与你当前问题无关的脚本作为你的起点。
听起来你只需要:
$ awk '
NR==FNR { file1[]; next }
FNR==1 || !( in file1)
' file1 file2
fruit number rand
potato 234 2342
grapes 9 572 422
我带着另一个 awk
问题回来了。
我有多个大文件,其中包含我要相互删除重复数据的数据。 假设我有以下一个月的数据:
fruit number rand
apple 12 342
taco 19 264
tortilla 2234 53423
tortillas 2 3431
apricot 13221 23424
apricots 24234 3252
pineapple 2342 2342
radish 1 3
下个月我收到此数据:
fruit number rand
pineapple 2 698
apple 34 472
taco 19 234
tortilla 16 58
tortillas 87 25
potato 234 2342
radish 1 55
grapes 9 572 422
apricot 13221 24
我想做的是获取第二个文件,并检查第一列的值以查看第一个文件中是否存在项目。如果是,我想从第二个文件中删除它们,只留下与第一个文件相关的第二个文件唯一的项目。
想要的结果会给我留下这样的东西:
fruit number rand DUPLICATE
pineapple 2 698 DUPE
apple 34 472 DUPE
taco 19 234 DUPE
tortilla 16 58 DUPE
tortillas 87 25 DUPE
potato 234 2342
radish 1 55 DUPE
grapes 9 572 422
apricot 13221 24 DUPE
或者,更明确地说:
fruit number rand
potato 234 2342
grapes 9 572 422
我正在想办法做到这一点而不必对文件进行排序。我试图将@karafka 的答案修改为
awk 'BEGIN { FS = OFS = " " }
NR==FNR {a[]++; next}
FNR==1 {print [=14=], "DUPLICATE"; next}
in a{if (a[]>1){print $(NF+1)="DUPE";delete a[]}}1' file{,}
我仍在学习 awk,非常感谢社区可以提供的任何帮助,但我会尝试解释我认为上述程序的作用。
- 第一行设置分隔符,输出分隔符为制表符。
- 此行读取第一个文件并存储一个数组,其中包含项目在列表中出现的次数。
- 这输出第一行,本质上是 header,在行中最后一项的末尾添加 "DUPLICATE"
- (这是我卡住的地方)如果在数组 "a" 中找到当前值,它应该检查存储的值是否大于 1。如果是,它应该在最后一列中打印单词 "DUPE"。最后它 returns 整行。
在测试文件中,我总是将所有标记为 "DUPE" 或什么都没有。
我也曾考虑过合并文件并以这种方式进行重复数据删除,但这会使我在第一个文件中留下不需要的 left-over 值。
我做错了什么?
我认为你做错的只是试图使用一堆与你当前问题无关的脚本作为你的起点。
听起来你只需要:
$ awk '
NR==FNR { file1[]; next }
FNR==1 || !( in file1)
' file1 file2
fruit number rand
potato 234 2342
grapes 9 572 422