2013-05-07 97 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