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?
Exécuter ceci
sort -t _ -k 2 -g data.file
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
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