我又回来了另一个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的答案related question。我尝试输入两个不同的文件,而不是两次传递相同的文件。显然我做错了什么。
awk 'BEGIN { FS = OFS = " " }
NR==FNR {a[$1]++; next}
FNR==1 {print $0, "DUPLICATE"; next}
$1 in a{if (a[$1]>1){print $(NF+1)="DUPE";delete a[$1]}}1' file{,}
我还在学习awk,非常感谢社区提供的任何帮助,但我会尝试解释我认为上述程序的作用。
在测试文件中,我不断将所有内容标记为“DUPE”或根本没有。
我还想过将这些文件组合在一起并进行重复删除,但这会让我从第一个文件中留下不需要的遗留值。
我做错了什么?
答案 0 :(得分:2)
我认为你做错了就是尝试使用一堆与当前问题无关的脚本作为起点。
听起来你只需要:
$ awk '
NR==FNR { file1[$1]; next }
FNR==1 || !($1 in file1)
' file1 file2
fruit number rand
potato 234 2342
grapes 9 572 422