我有一个包含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
答案 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