Come ordinare un file, in base ai suoi valori numerici per un campo?


114

Esempio file.txt:

  100 foo
  2 bar
  300 tuu

Durante l'utilizzo sort -k 1,1 file.txt, l'ordine delle righe non cambierà, anche se ci aspettiamo:

  2 bar
  100 foo
  300 tuu

Come ordinare un campo composto da numeri in base al valore numerico assoluto?

Risposte:


149

Dai un'occhiata alla pagina man di sort ...

   -n, --numeric-sort
          compare according to string numerical value

Quindi ecco un esempio ...

sort -n filename

1
Grazie a tutti, gente! Questo è cablato, perché ho guardato avanti e indietro la sua pagina man più volte e non ho visto quell'opzione. Ah, ero in una pagina man semplificata. Dannazione!
lukmac

1
Si noti che, per i floating point, l'utilizzo -g, --general-numeric-sortpotrebbe essere più consigliabile. Ciò consente inoltre la notazione scientifica, ad esempio 1.234E10 ecc.
Herpes Free Engineer

103

Se stai ordinando stringhe composte da testo e numeri misti, ad esempio nomi di file di log rotanti, l'ordinamento con sort -nnon funziona come previsto:

$ ls |sort -n
output.log.1
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.2
output.log.20
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9

In tal caso, l'opzione -Vfa il trucco:

$ ls |sort -V
output.log.1
output.log.2
output.log.3
output.log.4
output.log.5
output.log.6
output.log.7
output.log.8
output.log.9
output.log.10
output.log.11
output.log.12
output.log.13
output.log.14
output.log.15
output.log.16
output.log.17
output.log.18
output.log.19
output.log.20

dalla pagina man:

   -V, --version-sort
          natural sort of (version) numbers within text

1
Questo mi ha fatto inciampare, quindi grazie! L'altra cosa che mi ha incasinato, almeno sul mio Cygwin, è che anche quando il piping lsattraverso sedsostituzioni per rimuovere le lettere e lasciare solo i numeri, a quanto pare l'uscita di colore stava interessando cose. Quindi ls --color=neveranche correre ha fatto la differenza.
Max Starkenburg

Fantastico, -Vè esattamente quello che stavo cercando. Dovrei prendere l'abitudine di guardare prima le pagine man.
srowley

18

Bene, la maggior parte delle altre risposte qui si riferiscono a

sort -n

Tuttavia, non sono sicuro che funzioni per i numeri negativi. Ecco i risultati che ottengo con la versione di ordinamento 6.10 su Fedora 9.

File di input:

-0.907928466796875
-0.61614990234375
1.135406494140625
0.48614501953125
-0.4140167236328125

Produzione:

-0.4140167236328125
0.48614501953125
-0.61614990234375
-0.907928466796875
1.135406494140625

Che ovviamente non è ordinato per valore numerico.

Quindi, immagino che una risposta più precisa sarebbe da usare sort -nma solo se tutti i valori sono positivi.

PS: l'utilizzo sort -grestituisce gli stessi risultati per questo esempio

Modificare:

Sembra che le impostazioni locali influenzino il modo in cui il segno meno influisce sull'ordine ( vedi qui ). Per ottenere risultati corretti ho appena fatto:

LC_ALL=C sort -n filename.txt

7

Devi usare l'opzione di ordinamento numerico:

sort -n -k 1,1 File.txt


1

Devi eseguire il seguente comando:

sort -n -k1 filename

Dovrebbe farlo :)


-1

Usa sort -nr per ordinare in ordine decrescente. Fare riferimento

Ordinare

Fare riferimento alla pagina Man sopra per ulteriori riferimenti


-4
    echo " Enter any values to sorting: "
read n
i=0;
t=0;
echo " Enter the n value: "
for(( i=0;i<n;i++ ))
do
read s[$i]
done
for(( i=0;i<n;i++ ))
do
for(( j=i+1;j<n;j++ ))
do
if [ ${s[$i]} -gt ${s[$j]} ]
then
t=${s[$i]}
s[$i]=${s[$j]}
s[$j]=$t
fi
done
done
for(( i=0;i<n;i++ ))
do
echo " ${s[$i]}  "
done

1
Ti va di aggiungere un po 'di spiegazione testuale su cosa fa questo codice?
Stedy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.