过滤txt文件中的列

时间:2013-03-29 12:21:33

标签: linux bash awk

我有一个包含2列的csv文件,比如

bob,red
bob,red
sam,blue
judy,black
sam,blue
nick,blue
judy,red
sam,blue
nick,red
don,red
judy,blue

在Ubuntu中使用bash我需要一个过滤器,只选择第一列出现多次的行,但在第二列中匹配的值大于“X”。 因此,如果“X”= 2,结果将是

judy,black
judy,red
judy,blue
nick,blue
nick,red

或“X”= 3

judy,black
judy,red
judy,blue

2 个答案:

答案 0 :(得分:2)

您可以使用

sort -u 1.csv

去除重复值。然后,您可以计算第1列值的出现次数:

sort -u 1.csv | cut -f1 -d, | sort | uniq -c | sort -n

现在,您可以使用sed仅选择正确的出现次数:

sort -u 1.csv | cut -f1 -d, | sort | uniq -c | sort -n | sed -n '/ 2 /,$p'

其余部分留给读者练习。

答案 1 :(得分:0)

如果您希望输出 @choroba 而不是您在问题中要求的输出,但没有所有额外的管道:

awk -F, -v x=3 '!a[$0]++{c[$1]++}END{for(k in c)if(c[k]>=x)print k,c[k]}' file 
judy 3

awk -F, -v x=2 '!a[$0]++{c[$1]++}END{for(k in c)if(c[k]>=x)print k,c[k]}' file 
judy 3
nick 2

否则就是您实际要求的解决方案:

awk -F, -v x=2 '!a[$0]++{c[$1]++;n[$1]?n[$1]=n[$1]"\n"$0:n[$1]=$0}END{for(k in c)if(c[k]>=x)print n[k]}' file
judy,black
judy,red
judy,blue
nick,blue
nick,red

awk -F, -v x=3 '!a[$0]++{c[$1]++;n[$1]?n[$1]=n[$1]"\n"$0:n[$1]=$0}END{for(k in c)if(c[k]>=x)print n[k]}' file
judy,black
judy,red
judy,blue