我有一个可能有重复的csv文件。我需要一个awk命令的帮助,它只打印那些在文件中只出现一次的行。
例如: 输入文件:
a,b
a,c
a,d
a,b
a,c
b,e
b,f
b,d
b,f
b,e
输出:
a,d
b,d
感谢您的帮助。
答案 0 :(得分:2)
使用awk
:
awk '{arr[$0]++}END{for(i in arr)if(arr[i]==1)print i}' infile
排序和uniq
$ sort file | uniq -u # -u generates unique entries; -d nonunique
a,d
b,d
测试结果:
$ cat file
a,b
a,c
a,d
a,b
a,c
b,e
b,f
b,d
b,f
b,e
$ awk '{arr[$0]++}END{for(i in arr)if(arr[i]==1)print i}' file
a,d
b,d
<强>解释强>
arr[$0]++
$0
是当前行/记录,用作数组键,arr
是数组,arr[$0]++
包含键的出现次数,因此,每当awk找到重复键时,count将增加1。
所以在结束块,循环遍历数组,如果count等于1,则打印这样的数组键。
答案 1 :(得分:1)
uniq
命令中最短的一个:
uniq -u <(sort file)
-u
- 仅打印唯一的行输出:
a,d
b,d
答案 2 :(得分:0)
3种仅在blast contig上打印uniq的方法。
awk 'NF>4' valsidate_1k_vs_gdd13|grep Chr|awk '{arr[$1]++}END{for(i in arr)if(arr[i]==1)print i}'
awk 'NF>4' valsidate_1k_vs_gdd13|grep Chr|cut -f 1|sort| uniq -u
awk 'NF>4' valsidate_1k_vs_gdd13|grep Chr|cut -f 1|sort |uniq -c |grep '\ 1 Chr'