Perché il record non numerico viene visualizzato dopo "0" nell'ordinamento?


8

Voglio ordinare i file in base al numero nel nome file. Ecco i file:

$ ls *.f
0.f  13.f  1.f  22.f  4.f  abc.f

Il risultato dell'ordinamento:

$ ls *.f | sort -t. -k1n
0.f
abc.f # note this file!
1.f
4.f
13.f
22.f

Quello che mi aspettavo era:

$ ls *.f | sort -t. -k1n
abc.f
0.f
1.f
4.f
13.f
22.f

Perché è stato abc.fmostrato subito dopo 0.fe prima 1.f? È perché 0non è trattato come un numero da sort? Ho cercato sul web e non ho trovato alcun riferimento.


Lo stesso dopo aver aggiunto LC_ALL=C.
nn0p,

Risposte:


12

Il motivo è perché quando si utilizza l'ordinamento numerico, le stringhe senza numeri vengono trattate come zero. L'ordinamento GNU ottiene il comportamento giusto, ma non fa commenti sul perché. La pagina man su illumos per l'ordinamento SunOS fornisce una spiegazione:

-n
Limita la chiave di ordinamento a una stringa numerica iniziale, costituita da caratteri vuoti opzionali, segno meno facoltativo e zero o più cifre con un carattere radix opzionale e migliaia di separatori (come definito nella locale corrente), che viene ordinato in base al valore aritmetico . Una stringa di cifre vuota viene considerata come zero. Gli zeri iniziali e i segni sugli zeri non influiscono sull'ordinamento.

Questo comportamento è anche specificato in SUSv4 e POSIX.1-2008 ( http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sort.html ), usando la stessa verbosità della pagina man illumos.

L'ordinamento GNU ha anche -g"ordinamento numerico generale", che ordina per numeri in virgola mobile anziché numeri interi in cui le stringhe di cifre vuote sono ordinate prima di zero. Non sono sicuro che si tratti di un effetto collaterale o intenzionale. Tuttavia, -gviene fornito con un avviso poiché è significativamente più lento di -n. Se stai ordinando un set di dati di grandi dimensioni o fai qualcosa che gli utenti stanno aspettando, dovresti evitare -g.


Per completezza dovresti anche menzionare il modo in cui sorttratta due linee che hanno la stessa chiave.
Kasperd,

1

puoi usare -g

-g, --generale-ordinamento numerico confronta in base al valore numerico generale

root@virt01-ubuntu:~# ls  | sort -t. -k1g
a.txt
0.txt
1.txt
2.txt
3.txt
root@virt01-ubuntu:~#
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.