1

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

2 回答 2

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'

其余的留给读者练习。

于 2013-03-29T12:29:41.297 回答
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
于 2013-03-29T12:52:23.160 回答