【问题标题】:Remove all lines from file with duplicate value in field, including the first occurrence从文件中删除字段中具有重复值的所有行,包括第一次出现的行
【发布时间】:2014-04-14 00:33:46
【问题描述】:

我想删除我的数据文件中包含第 2 列中的值的所有行,该值在其他行的第 2 列中重复。

我已按第 2 列中的值排序,但不知道如何仅将 uniq 用于一个字段中的值,因为值不一定具有相同的长度。

或者,我可以使用像

这样的 awk 单行来删除带有重复项的行
awk -F"[,]" '!_[$2]++'

但这会保留第 2 列中重复值第一次出现的行。

例如,如果我的数据是

a,b,c
c,b,a
d,e,f
h,i,j
j,b,h

我想删除第二列中出现 b 的所有行(包括第一行)。 像这样:

d,e,f
h,i,j

感谢您的建议!!

【问题讨论】:

  • 不一定使用 awk。我最初是在寻找 grep 或 uniq 的解决方案,但我对任何事情都持开放态度。
  • 行的输出顺序重要吗?
  • 不,行的输出顺序无关紧要。谢谢!

标签: unix awk terminal uniq


【解决方案1】:

如果顺序不重要,那么以下应该起作用:

awk -F, '
!seen[$2]++ {
    line[$2] = $0
}
END { 
    for(val in seen)
        if(seen[val]==1) 
          print line[val]
}' file

输出

h,i,j
d,e,f

【讨论】:

    【解决方案2】:

    用 grep 解决:

    grep -v -E '\b,b,\b' text.txt
    

    文件内容:

    $ cat text.txt 
    a,b,c
    c,b,a
    d,e,f
    h,i,j
    j,b,h
    a,n,b
    b,c,f
    
    $ grep -v -E '\b,b,\b' text.txt 
    d,e,f
    h,i,j
    a,n,b
    b,c,f
    

    希望对你有帮助

    【讨论】:

    • 这适用于示例数据,但我的实际数据在 col 2 中包含数百个不同的基因名称。我不确定是否/如何调整它...
    • @user3288154 你想完成什么?
    • @user3288154 将其重定向到文件,仅此而已。
    • 当我在我的文件上使用它时,所有行仍然出现,包括第 2 列中具有相同值的行。
    【解决方案3】:

    一些不同的 awk:

    awk -F, '
       BEGIN {f=0}
       FNR==NR {_[$2]++;next}
       f==0 {
          f=1
          for(j in _)if(_[j]>1)delete _[j]
       }
       $2 in _
    ' file file
    

    说明

    awk 两次通过文件 - 这就是为什么它在最后出现两次。在第一遍(当FNR==NR 时)我计算每列2 在数组_[] 中出现的次数。在第一遍结束时,我删除了_[] 中多次出现该元素的所有元素。然后,在第二次通过时,我打印第二个字段出现在 _[] 中的行。

    【讨论】:

    • 太棒了!很高兴能提供帮助。
    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多