web-dev-qa-db-fra.com

Comment faire une sortie de tri naturel de "uniq -c" dans l'ordre décroissant / croissant? - unix

Comment faire un tri naturel sur uniq -c sortie?

Lorsque le nombre est <10, le uniq -c | sort la sortie semble correcte:

alvas@ubi:~/testdir$ echo -e "aaa\nbbb\naa\ncd\nada\naaa\nbbb\naa\nccd\naa" > test.txt
alvas@ubi:~/testdir$ cat test.txt
aaa
bbb
aa
cd
ada
aaa
bbb
aa
ccd
aa
alvas@ubi:~/testdir$ cat test.txt | sort | uniq -c | sort
      1 ada
      1 ccd
      1 cd
      2 aaa
      2 bbb
      3 aa

mais lorsque les nombres sont> 10 et même en milliers/centaines, le tri est erroné car il trie par chaîne et non par tri entier naturel:

alvas@ubi:~/testdir$ echo -e "aaa\nbbb\naa\nnaa\nnaa\naa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnnaa\ncd\nada\naaa\nbbb\naa\nccd\naa" > test.txt
alvas@ubi:~/testdir$ cat test.txt | sort | uniq -c | sort
     10 naa
      1 ada
      1 ccd
      1 cd
      1 nnaa
      2 aaa
      2 bbb
      4 aa

Comment faire une sortie de tri naturel de "uniq -c" dans l'ordre décroissant/croissant?

29
alvas

Utilisation -n dans votre commande sort, pour qu'elle soit triée numériquement. Aussi -r vous permet d'inverser le résultat:

$ sort test.txt | uniq -c | sort -n
      1 ada
      1 ccd
      1 cd
      1 nnaa
      2 aaa
      2 bbb
      4 aa
     10 naa

$ sort test.txt | uniq -c | sort -nr
     10 naa
      4 aa
      2 bbb
      2 aaa
      1 nnaa
      1 cd
      1 ccd
      1 ada

De man sort:

- n, - tri numérique

comparer selon la valeur numérique de la chaîne

- r, --reverse

inverser le résultat des comparaisons

36
fedorqui