2013-05-07 133 views
2

這裏仍然是初學者。如何計算表中唯一值的唯一值

如何使用bash awk sed等計算表中唯一一組其他值的唯一值? 所以在兩個(或更多)列的表像這樣:

AA a 
AA b 
AA c 
AA a 
AB b 
AA a 
AB c 
AA a 
AC b 
AC b 
XX z 

我將如何得到

AA 3 
AB 2 
AC 1 
XX 1 

輸出對輸出的第二列是唯一值的計數所有可能的第一列值;

因此,有6節AA,但我不希望使用SQL只有3個獨特的AA值等

。只是bash命令行程序,如awk的...任何幫助是非常讚賞:)

回答

3

這將這樣的伎倆:

$ awk '!a[$0]++{u[$1]++}END{for (k in u) print k,u[k]}' file 
AA 3 
AB 2 
AC 1 
XX 1 

爲了確保有序輸出管sort -rnk2爲第二反向排序數值現場:

$ awk '!a[$0]++{u[$1]++}END{for (k in u) print k,u[k]}' file | sort -rnk2 
AA 3 
AB 2 
XX 1 
AC 1 

說明:

我們把所有的獨特林的計數es在關聯數組a中,如果我們之前沒有看到當前行,則只更新第二個數組u

+2

幹得好!爲什麼當sudo_O在線時想弄清楚一些awk代碼? :D – fedorqui 2013-05-07 10:31:51

+0

謝謝:)部分正確的這隻適用於只有兩列的表格才能在多列表格上工作(其中感興趣的列是前2列):awk'{print $ 1FS $ 2}'文​​件.txt | awk'!a [$ 0] ++ {u [$ 1] ++} END {for(k in u)print k,u [k]}'有沒有更簡潔的方法?再次感謝 – 2013-05-07 10:58:01

2

我就在想,如果它在其他方面可能的,這裏是一個非awk解決方案:

sort file | uniq | cut -f1 -d' ' | uniq -c | rev 
0
sort -u file | uniq -cw2 | awk '{print $2,$1}' 
+0

請注意,這是線上前兩個字符的固定寬度解決方案。 – 2013-05-07 12:00:59