Tri des chaînes avec des nombres en Bash [dupliquer]

cette question a déjà une réponse ici:

j'ai souvent voulu trier les chaînes avec des nombres dedans de sorte que, lors du tri par exemple abc_2, abc_1, abc_10 le résultat est abc_1, abc_2, abc_10 . Chaque mécanisme de tri que j'ai vu trie comme abc_1, abc_10, abc_2 , qui est caractère par caractère de la gauche.

y a-t-il un moyen efficace de trier pour obtenir le résultat que je veux? L'idée de regarder chaque caractère, de déterminer s'il s'agit d'un chiffre, de construire une sous-chaîne à partir des chiffres suivants et de trier cela comme un nombre est trop épouvantable à envisager dans bash .

n'A pas de barbe *nix gourou de la mise en œuvre d'une version alternative de sort avec une option --sensible_numerical ?

44
demandé sur jww 2013-06-12 13:23:47

3 réponses

Exécuter ce

sort -t _ -k 2 -g data.file
  • - séparateur t
  • - K clé / colonne
  • - G General numerical sort
90
répondu Grzegorz Żur 2014-10-22 10:28:43

je pense que C'est une extension GNU à sort , mais vous cherchez l'option --version-sort (ou -V ):

$ printf "prefix%d\n" $(seq 10 -3 1)
prefix10
prefix7
prefix4
prefix1

$ printf "prefix%d\n" $(seq 10 -3 1) | sort
prefix1
prefix10
prefix4
prefix7

$ printf "prefix%d\n" $(seq 10 -3 1) | sort --version-sort
prefix1
prefix4
prefix7
prefix10

https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

25
répondu glenn jackman 2013-06-12 10:06:49

Essayez cette

$ cat a.txt
abc_1
abc_4
abc_2
abc_10
abc_5

$ sort -V a.txt
abc_1
abc_2
abc_4
abc_5
abc_10
22
répondu Bill 2013-06-12 11:38:33