2013-06-12 4 views
39

J'ai souvent voulu trier les chaînes avec des nombres afin que, lors du tri par ex. 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 abc_1, abc_10, abc_2, c'est-à-dire le caractère par caractère de gauche.bash: trier des chaînes avec des nombres

Y at-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 de chiffres ultérieurs et de trier cela comme un nombre est trop effroyable pour être envisagée dans bash.

Est-ce que le nix gub * nix n'a pas implémenté une autre version de sort avec une option --sensible_numerical?

+0

Est-ce votre préfixe toujours le même? –

Répondre

75

Execute cette

sort -t _ -k 2 -g data.file 
  • séparateur -t
  • -k clé/colonne
  • -g de tri numérique général
+1

Il a besoin de trier par numéro - c'est le deuxième champ: 'printf" abc_2 \ nabc_1 \ nabc_10 \ n "| trier -t _ -k 2 -g' –

+0

@RomanNewaza, merci! Vous savez, zéro est aussi un nombre. :-) –

+1

Ce n'est pas basé sur zéro. Regardez la page de manuel. –

21

Je pense que c'est une extension GNU sort, mais vous recherchez 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

+0

hélas, cette option n'a pas encore été implémentée sur la version vieillie du tri disponible sur la version gériatrique de RHEL que je développe. – hardcode57

+0

"sort -V" a bien fonctionné pour moi. – nurettin

+0

"sort -V" a aussi fonctionné pour moi, quelle version de RHEL utilisez-vous? –

18

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 
Questions connexes