2013-03-29 47 views
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 
+0

爲什麼當x = 2時bob不在那裏? – Kent

+0

,因爲bob的第二列在所有行中都是相同的 – webtron

回答

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 
+0

這也適用,但在列之間創建了一個額外的空白行匹配 – webtron

+0

@webtron如果您不希望用換行符分隔組,請參閱編輯。 –

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' 

其餘部分留作爲讀者鍛鍊。