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 を使用すると、列 1 の値が複数回表示されるが、列 2 の「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 に答える