2013-05-07 4 views
2

Encore un débutant ici. Comment puis-je compter les valeurs uniques d'un ensemble unique d'autres valeurs dans une table en utilisant bash awk sed etc? Ainsi, dans deux colonne de table (ou plus) comme celle-ci:Comment compter des valeurs uniques de valeurs uniques dans un tableau

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

comment pourrais-je obtenir une sortie de

AA 3 
AB 2 
AC 1 
XX 1 

Lorsque la deuxième colonne de la sortie est le nombre de valeurs uniques de toutes les valeurs possibles de la première colonne;

Donc, il y a 6, mais seulement 3 AAs valeurs AA uniques etc.

Je ne veux pas utiliser SQL. juste des programmes de ligne de commande bash tels que awk ... toute aide est très appréciée :)

Répondre

3

Cela fera l'affaire:

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

Pour que le tuyau de sortie triée à sort -rnk2 pour une sorte numérique inverse sur la seconde terrain:

$ 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 

Explication:

Nous gardons un compte de tout le lin unique, es dans le tableau associatif a et seulement mettre à jour le tableau secondaire u si nous n'avons pas vu la ligne en cours avant.

+2

bien fait! Pourquoi essayer de trouver un code awk quand sudo_O est en ligne? : D – fedorqui

+0

Merci :) Partiellement correct cela ne fonctionne que pour les tables de seulement deux colonnes pour travailler sur une table de plusieurs colonnes (où les colonnes d'intérêt étaient les 2 premières) J'ai fait: awk '{print $ 1FS $ 2}' fichier .txt | awk '! a [$ 0] ++ {u [$ 1] ++} FIN {pour (k en u) imprimer k, u [k]}' Y at-il une façon plus concise? Merci encore –

2

Je pensais s'il est possible d'une autre manière, voici une solution non awk:

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

Notez qu'il s'agit d'une solution de largeur fixe sur les deux premiers caractères de la ligne. –