使用awk删除多个文件中相同列值的所有实例

时间:2017-04-13 21:02:45

标签: unix awk terminal gawk gnu-coreutils

我又回来了另一个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,非常感谢社区提供的任何帮助,但我会尝试解释我认为上述程序的作用。

  1. 第一行将分隔符和输出分隔符设置为制表符。
  2. 此行读取第一个文件并存储一个数组,其中包含项目在列表中出现的次数。
  3. 这输出第一行基本上是标题,在行的最后一项末尾添加“DUPLICATE”
  4. (这就是我被困的地方)如果在数组“a”中找到当前值,它应该检查存储的值是否大于1。如果是,它应该在最后一栏打印“DUPE”一词。最后它返回整行。
  5. 在测试文件中,我不断将所有内容标记为“DUPE”或根本没有。

    我还想过将这些文件组合在一起并进行重复删除,但这会让我从第一个文件中留下不需要的遗留值。

    我做错了什么?

1 个答案:

答案 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