AWK从两列中识别重复项但打印第一个实例

时间:2017-06-20 10:33:08

标签: bash awk

新手在这里,我需要在两列中删除包含重复项的行(即row1和row2在第1列中具有相同的值,删除其中一行并保留一行并对第一列执行相同操作)文件是选项卡分隔

以下是示例数据

580615  580795  Del
580769  580795  Del
656123  657154  Del
656123  657195  Del

预期的输出

580769  580795  Del
656123  657154  Del

我正在使用Bash,这是我正在开发的管道中的中间步骤。

我试过用这个

awk 'seen[$1, $2]++ == 1' file 

awk 'n=x[$1,$2]{print n"\n"$0;} {x[$1,$2]=$0;}' file

但我没有得到任何输出。

任何建议将不胜感激 谢谢!

4 个答案:

答案 0 :(得分:1)

您可以像这样使用awk

awk '!a[$1]++ && !b[$2]++' file

580615  580795  Del
656123  657154  Del

这使得2个关联数组ab具有第1列和第2列的唯一值。

答案 1 :(得分:0)

如果我理解正确,你可以这样做:

awk '{ f[$1]+=1; s[$2]+=1; if(f[$1]==1 && s[$2]==1) print $0;}' file

您捕获每一行并计算每列的出现次数( f irst和 s econd)。如果两列是新的,那么我们打印该行。

答案 2 :(得分:0)

$ cat file

580615  580795  Del
580769  580795  Del
656123  657154  Del
656123  657195  Del
  1. 使用sort

    $ sort -uk1,1 file | sort -uk2,2
    
  2. -k1,1对第一行进行排序并删除重复项,然后

    -k2,2对第二行进行排序并删除重复项

    1. 使用sortuniq

      $ sort -uk1,1 file | uniq -f1
      
    2. 输出继电器:

      580615  580795  Del
      656123  657154  Del
      

      如果将-r添加到sort

      $ sort -uk1,1r file | sort -uk2,2
      

      然后输出

      580769  580795  Del
      656123  657154  Del
      

答案 3 :(得分:0)

尝试:Anubhava解决方案的一个简单版本。

awk '!array1[$1] && !array2[$2]{print;} {array1[$1]=$1;array2[$2]=$2}'   Input_file

所以在这里检查条件是否!array1 [$ 1]表示当前行的第一个字段不存在于名为array1的数组中,类似地,如果array2中不存在$ 2,则打印当前行。然后在array1中创建数组元素,其索引为$ 1,值为$ 1,然后创建其索引为$ 2且值为$ 2的array2。