awk命令,打印在csv文件中只出现一次的行

时间:2017-10-06 19:28:59

标签: linux shell awk

我有一个可能有重复的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

感谢您的帮助。

3 个答案:

答案 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'