从字段中删除具有重复值的文件中的所有行,包括第一次出现的行

时间:2014-03-10 18:15:16

标签: unix awk terminal uniq

我想删除数据文件中包含第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

感谢您的任何建议!!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用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

希望有所帮助

答案 2 :(得分:0)

一些不同的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在数组_[]中出现的次数。在第一遍结束时,我删除了_[]的所有元素,其中多次看到该元素。然后,在第二遍,我打印第二个字段出现在_[]

的行