Discussione:
Sort e' impazzito? certamente no, ma...
(troppo vecchio per rispondere)
Yoda
2021-07-30 06:17:57 UTC
Permalink
Ho il seguente file pippo:
-cite-
levante 4
scirocco 2
levante 3

bavagne 2
levante 3
7
0
scirocco 2
1
-/cite-

Se do "sort -h" oppure "sort -n" mi accorgo che per sort lo zero non
e' un numero. E questa e' la prima sorpresa.

Ma il per me scioccante e' stato questo:
[~]yoda_$: sort -nu pippo
levante 4
1
7

Dunque sort vede tutte le righe, che non iniziano con un numero,
come tutte uguali tra loro.
Un bel grazie a chi me lo spiega!
--
bye, Yoda
Joe
2021-07-30 07:57:04 UTC
Permalink
Post by Yoda
-cite-
levante 4
scirocco 2
levante 3
bavagne 2
levante 3
7
0
scirocco 2
1
-/cite-
Se do "sort -h" oppure "sort -n" mi accorgo che per sort lo zero non
e' un numero. E questa e' la prima sorpresa.
[~]yoda_$: sort -nu pippo
levante 4
1
7
Dunque sort vede tutte le righe, che non iniziano con un numero,
come tutte uguali tra loro.
Un bel grazie a chi me lo spiega!
Prima posta il file di test, per intero, a scanso di equivoci
includilo tra due "tratteggi", tipo:


pippo.txt
-------------
levante 4
scirocco 2
...
...
ultima riga del file
--------------------
Joe
2021-07-30 10:59:30 UTC
Permalink
Post by Joe
Post by Yoda
-cite-
levante 4
scirocco 2
levante 3
bavagne 2
levante 3
7
0
scirocco 2
1
-/cite-
Se do "sort -h" oppure "sort -n" mi accorgo che per sort lo zero non
e' un numero. E questa e' la prima sorpresa.
[~]yoda_$: sort -nu pippo
levante 4
1
7
Dunque sort vede tutte le righe, che non iniziano con un numero,
come tutte uguali tra loro.
Un bel grazie a chi me lo spiega!
Prima posta il file di test, per intero, a scanso di equivoci
pippo.txt
-------------
levante 4
scirocco 2
...
...
ultima riga del file
--------------------
Ah... niente lo avevi già fatto mettendo "cite",
Ok non sono sicuro, ma l'inghippo sta nel criterio con cui dici
a sort di considerare il contenuto del file (stringhe, numeri,
numeri umanamente leggibili ecc ecc).

Se non metti opzioni, sort considera il contenuto come
"versioning" cioè se ho ben capito stringhe alfanumeriche.
E di conseguenza esegue l'ordinamento stile dizionario per
capirci. E infatti:
----------------
$ sort pippo.txt

0
1
7
bavagne 2
levante 3
levante 3
levante 4
scirocco 2
scirocco 2
------------

Prima mette la righa vuota, poi le stringhe che iniziano
con un numero e mette prima lo zero poi l'uno e infine il
7, ma li considera come stringhe non li ordina così per via
della loro entità numerica dal più piccolo al più grande,
li ordina così perché nel suo dizionario il carattere "0"
viene prima del carattere "1".
Ci siamo capiti penso...

Ora se vuoi eliminare dall'output i duplicati, aggiungi
l'opzione -u. Oppure puoi anche mandare l'out in pipe a
uniq. Il risultato non cambia in questo caso.
----------------------
$ sort pippo.txt |uniq

0
1
7
bavagne 2
levante 3
levante 4
scirocco 2
-------------------------
$ sort -u pippo.txt

0
1
7
bavagne 2
levante 3
levante 4
scirocco 2
------------

Invece l'inghippo nasce se si introduce ad esempio l'opzione
-g, che tratta gli elementi come numeri naturali.
La domanda è, ma cosa ne sarà delle stringhe alfanumeriche
in quel modo? Se dico a sort di considerare i numeri e poi
gli do in pasto anche delle stringhe non numeriche qualcosa
di inaspettato può accadere, non c'è da stupirsi:

---------------
$ cat pippo.txt
levante 4
scirocco 2
levante 3

bavagne 2
levante 3
7
0
scirocco 2
1
--------------------
$ sort -gu pippo.txt
levante 4
0
1
7
-----

Come ragiona sort:
- inizio a valutare i numeri nel file
- vede la prima riga e dice questo non è un numero:
lo salvo e lo considero come prima occorrenza di
questo tipo di roba, cioè di tipo stringa
- trovo le successive 4 righe, non sono numeri e
pertanto li metto nella categoria della prima riga
- trovo il 7 lo 0 e questi li ordino numericamente
- trovo "scirocco..." lo accodo alle stringhe
- trovo l'ultima riga con 1 e lo metto insieme ai numeri
ordinandolo correttamente.
- Poi ho l'opzione -u allora stampo la roba della prima categoria,
cioè le stringhe, ma numericamente è come se fossero la stessa
cosa, cioè è come se avessero lo stesso valore numerico parlando
di numeri naturali.
- Allora, come dice il "man sort", metto in output solo la prima
occorrenza di tutto quello che ho messo nella categoria "non numeri"
- Infine prendo i numeri ordinati e li metto in output, se ci fossero
stati due numeri uguali, allora avrei stampato solo una volta senza
il doppione.

Da notare che in questo caso usare sort senza "-u" e dare
l'out a uniq, porta ad un risultato molto diverso, perché
uniq, considera l'out di sort come stringhe e non più come
numeri, quindi cassa via solamente i doppioni delle stringhe.
--------------------------
$ sort -g pippo.txt | uniq

bavagne 2
levante 3
levante 4
scirocco 2
0
1
7
------------

Qui sopra sort ha considerato le stringhe ordinandole, anche
se gli avevamo detto che erano numeri. Non è un problema. Il
problema nasce quando gli si chiede anche di eliminarle se sono
numericamente uguali (intendendo numeri naturali uguali).


Spero sia chiarito. Lo stesso ragionamento vale per gli altri
tipi di criterio con cui considerare il contenuto da ordinare:

--sort=WORD
sort according to WORD:
general-numeric -g,
human-numeric -h,
month -M,
numeric -n,
random -R,
version -V

Se non si specifica, il default dovrebbe essere "version",
come nel mio primo esempio.
Nel tuo caso avevi scelto "numeric" e "human-numeric" se ben
ricordo... Ottenendo sorprese simili al caso "general-numeric"
che ho riportato qui sopra.

Ok, è tutto! :)
Yoda
2021-07-30 12:59:10 UTC
Permalink
Post by Joe
Post by Yoda
-cite-
levante 4
scirocco 2
levante 3
bavagne 2
levante 3
7
0
scirocco 2
1
-/cite-
-snip-

-snip-
Post by Joe
Da notare che in questo caso usare sort senza "-u" e dare
l'out a uniq, porta ad un risultato molto diverso, perché
uniq, considera l'out di sort come stringhe e non più come
numeri, quindi cassa via solamente i doppioni delle stringhe.
--------------------------
$ sort -g pippo.txt | uniq
bavagne 2
levante 3
levante 4
scirocco 2
0
1
7
------------
Si' e' tutto chiaro molte grazie. In aggiunta ai chiarimenti m'hai
dato due cose per me essenziali: l'opzione -g (non ci avevo mai
badato!) che tratta anche lo 0 come numero; e la profonda differenza
tra: "sort -u" e "sort | uniq" ciao e grazie ancora!
Post by Joe
Spero sia chiarito. Lo stesso ragionamento vale per gli altri
--sort=WORD
general-numeric -g,
human-numeric -h,
month -M,
numeric -n,
random -R,
version -V
Se non si specifica, il default dovrebbe essere "version",
come nel mio primo esempio.
Nel tuo caso avevi scelto "numeric" e "human-numeric" se ben
ricordo... Ottenendo sorprese simili al caso "general-numeric"
che ho riportato qui sopra.
Ok, è tutto! :)
--
Yoda
Continua a leggere su narkive:
Loading...