2013-06-12 21 views
39

Spesso ho voluto ordinare stringhe con numeri in modo che, durante l'ordinamento, ad es. abc_2, abc_1, abc_10 il risultato è abc_1, abc_2, abc_10. Ogni tipo di meccanismo che ho visto ordina come abc_1, abc_10, abc_2, che è carattere per carattere da sinistra.bash: stringhe di ordinamento con numeri

C'è qualche modo efficiente per ordinare per ottenere il risultato che voglio? L'idea di guardare ogni personaggio, determinare se si tratta di un numero, costruire una sottostringa con numeri successivi e ordinarla in base a un numero è troppo terrificante da contemplare in bash.

Nessun guru barbuto * nix ha implementato una versione alternativa di sort con un'opzione --sensible_numerical?

+0

È il prefisso sempre lo stesso? –

risposta

75

Eseguire questa

sort -t _ -k 2 -g data.file 
  • separatore -t
  • -k chiave/colonna
  • -g ordinamento numerico generale
+1

Ha bisogno di ordinare per numero - è il secondo campo: 'printf" abc_2 \ nabc_1 \ nabc_10 \ n "| sort -t _ -k 2 -g' –

+0

@RomanNewaza, Grazie! Sai, zero è anche un numero. :-) –

+1

Questo non è basato su zero. Guarda la pagina man. –

21

Credo che questo è un'estensione GNU sort, ma stai cercando l'opzione --version-sort (o):

$ 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

ahimè, questa opzione non è ancora stata implementata sulla versione invecchiata di sort avilable sulla versione geriatrica di RHEL che sto sviluppando. – hardcode57

+0

"sort -V" ha funzionato bene per me. – nurettin

+0

"sort -V" ha funzionato anche per me, quale versione di RHEL stai usando? –

18

Prova questa

$ 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 
Problemi correlati