2010-04-12 25 views

risposta

29

Ecco un semplice esempio per farti andare:

echo "81 4 6 12 3 0" | tr " " "\n" | sort -g

tr traduce gli spazi che delimitano i numeri, in ritorni a capo, perché sorta utilizza ritorni a capo come delimitatori (vale a dire che è per l'ordinamento linee di testo). L'opzione -g indica l'ordinamento da ordinare per "valore numerico generale".

man sort per ulteriori dettagli su sort.

+3

ho allegato un altro '| tr' con i parametri invertiti per recuperare una stringa delimitata dallo spazio. – isuldor

+0

Per invertire l'ordinamento, usare '-r'. – Tim

2
$ s=(one two three four) 
$ sorted=$(printf "%s\n" ${s[@]}|sort) 
$ echo $sorted 
four one three two 
3

Questa è una variante risposta di ghostdog74 che è troppo grande per essere in un commento. Mostra le cifre anziché i nomi dei numeri e sia la stringa originale che il risultato sono in stringhe delimitate da spazi (anziché una matrice che diventa una stringa delimitata da una nuova riga).

$ s="3 2 11 15 8" 
$ sorted=$(echo $(printf "%s\n" $s | sort -n)) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 3 8 11 15 

Se non è stato utilizzato il echo quando si imposta il valore di sorted, quindi la stringa è a capo di esso. In tal caso riecheggiandolo senza virgolette si mette tutto su una riga, ma, come lo farebbe eco con le virgolette, ogni numero apparirebbe sulla sua stessa riga. Questo è il caso se l'originale è un array o una stringa.

# demo 
$ s="3 2 11 15 8" 
$ sorted=$(printf "%s\n" $s | sort -n) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 
3 
8 
11 
15 
1

Utilizzando l'espansione di parametro Bash (per sostituire gli spazi con a capo) che possiamo fare:

str="3 2 11 15 8" 
sort -n <<< "${str// /$'\n'}" 

# alternative 
NL=$'\n' 
str="3 2 11 15 8" 
sort -n <<< "${str// /${NL}}" 
0

Se in realtà hanno una stringa delimitato da spazi di numeri, allora una delle altre risposte fornite avrebbe funzionato bene. Se la tua lista è un array bash, allora:

oldIFS="$IFS" 
IFS=$'\n' 
array=($(sort -g <<< "${array[*]}")) 
IFS="$oldIFS" 

potrebbe essere una soluzione migliore. Il delimitatore di nuova riga sarebbe utile se si desidera generalizzare l'ordinamento di una matrice di stringhe anziché di numeri.

+0

la mia lista è un array bash, ma questo non funziona per me: 'packages =" $ (sort <<< $ {! Package2apk [@]}) "' – Jayen

0
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \ 
    "6 7 4 1 2 3" | sort -n 
+0

Mentre questo snippet di codice può essere la soluzione, [incluso una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entely- code-based-answers) aiuta davvero a migliorare la qualità del tuo post.Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. – yivi

0

Migliorare il bel Bash di Evan Krall "sorta di matrice", limitando l'ambito di IFS per un singolo comando:

printf "%q\n" "${IFS}" 
array=(3 2 11 15 8) 
array=($(IFS=$'\n' sort -n <<< "${array[*]}")) 
echo "${array[@]}" 
printf "%q\n" "${IFS}" 
3

Questa è una variante da @JamesMorris risposta:

echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs 

Invece di tr, io uso xargs -n1 per convertire in nuove linee. L'ultimo xargs è di riconvertire, in una sequenza di numeri separati da spazi.

Problemi correlati