web-dev-qa-db-fra.com

Tri des chaînes avec des nombres dans Bash

J'ai souvent voulu trier les chaînes avec des nombres afin que, par exemple, lors du tri abc_2, abc_1, abc_10 le résultat est abc_1, abc_2, abc_10. Tous les mécanismes de tri que j'ai vus, comme abc_1, abc_10, abc_2, c'est-à-dire caractère par caractère à partir de la gauche.

Existe-t-il un moyen efficace de trier pour obtenir le résultat souhaité? L’idée de regarder chaque caractère, de déterminer s’il s’agit ou non d’un chiffre, de construire une sous-chaîne à partir de chiffres ultérieurs et de trier ce chiffre sous forme de nombre est trop horrible à envisager dans bash.

Nuru guru n'a pas implémenté une version alternative de sort avec un --sensible_numerical option?

54
hardcode57

Exécuter ceci

sort -t _ -k 2 -g data.file
  • -t séparateur
  • -k clé/colonne
  • -g tri numérique général
104
Grzegorz Żur

Je pense que c’est une extension GNU à sort, mais vous recherchez le --version-sort (ou -V) option:

$ 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

36
glenn jackman

Essaye ça

$ 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
26
Bill