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
?
3 réponses
Exécuter ce
sort -t _ -k 2 -g data.file
- - séparateur t
- - K clé / colonne
- - G General numerical sort
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
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