Newsgroup: it.comp.os.linux.iniziare
Titolo: Sort e' impazzito? certamente no, ma...

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
 


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
--------------------


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!  :)

 Ok, è tutto!  :)
 
-- 
Yoda