新手在这里,我需要在两列中删除包含重复项的行(即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
但我没有得到任何输出。
任何建议将不胜感激 谢谢!
答案 0 :(得分:1)
您可以像这样使用awk
:
awk '!a[$1]++ && !b[$2]++' file
580615 580795 Del
656123 657154 Del
这使得2个关联数组a
和b
具有第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
使用sort
:
$ sort -uk1,1 file | sort -uk2,2
-k1,1
对第一行进行排序并删除重复项,然后
-k2,2
对第二行进行排序并删除重复项
使用sort
和uniq
:
$ sort -uk1,1 file | uniq -f1
输出继电器:
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。