使用 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,非常感谢社区可以提供的任何帮助,但我会尝试解释我认为上述程序的作用。

  1. 第一行设置分隔符,输出分隔符为制表符。
  2. 此行读取第一个文件并存储一个数组,其中包含项目在列表中出现的次数。
  3. 这输出第一行,本质上是 header,在行中最后一项的末尾添加 "DUPLICATE"
  4. (这是我卡住的地方)如果在数组 "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