我想删除数据文件中包含第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
感谢您的任何建议!!
答案 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在数组_[]
中出现的次数。在第一遍结束时,我删除了_[]
的所有元素,其中多次看到该元素。然后,在第二遍,我打印第二个字段出现在_[]
。