Comando SORT

Sintassi completa del comando, nella versione GNU e SVR4:

sort [-cmus] [-t separatore] [-o output-file] [-T tempdir]
[-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file…]

SORT è fondamentalmente un filtro, quindi scrive il suo risultato sullo standard output, e, se si omette file, legge perciò da standard input.
SORT ha come scopo principale quello di ordinare, già che c’erano i progettisti gli hanno aggiunto alcune funzionalità similari, chiamandole pomposamente “modi di operazione”.

Il modo di operare viene cambiato utilizzando il primo gruppo di parametri:

-c (controlla)
si limita a controllare se il file è davvero ordinato. Se sì, esce silenzioso: altrimenti, spernacchia un messaggio di errore (come “sort: disorder on pippo”) ed esce con codice

-m (merge)
fa il merge dei file indicati. Essi devono già essere ordinati per conto loro: l’opzione serve semplicemente per accelerare l’ordinamento, invece che fare tutti i controlli tipici.

-u (unico)
stampa solo la prima di una successione di righe che sono uguali al confronto, a meno che non si usi anche -c, nel qual caso il programma si arrabbia se ci sono due righe consecutive uguali. Nota bene: le righe non devono essere uguali, basta che lo sia la parte che si confronta.

-s (stabile)
è infine un’opzione specifica al GNU sort, che pensa di fare un favore mettendo in ordine le righe byte per byte come extrema ratio[6], quando i confronti indicati danno un risultato di identità. Se la cosa non ti piace, e vuoi tenere il tuo ordine in questi casi, devi ricordarti di aggiungere anche questa opzione.

Un altro “aiuto” del GNU sort consiste nell’aggiungere un newline all’ultima riga, se per caso le mancasse. In compenso, afferma di non avere limiti sulla lunghezza delle righe di input, o restrizioni sui byte ammessi all’interno di queste righe. Io mi fido sulla parola.

Opzioni
Passiamo ora alle altre opzioni del comando: ce ne sono di due tipi diversi. Le prime due si applicano globalmente a tutto il file:

-o (output) indica il file di output. Il bello è che esso può anche essere un file di input: ci pensa il programma a farne una copia prima di lavorarci su.
-t (separaTore) specifica un carattere di separazione tra i campi, per trovare le chiavi di ordinamento. Il default è la stringa vuota tra un carattere che non sia un whitespace e un whitespace: cioè, tutti i campi iniziano con whitespace (tranne al più il primo) e terminano con un carattere non whitespace. Il separatore non fa
A proposito del separatore, ricordati che se lo specifichi, e non usi il default, può capitare di trovarsi dei campi senza nulla dentro: se il separatore è $, $$ delimita appunto un campo nullo.

Le opzioni modificano l’ordine delle righe di output, e possono invece essere globali o locali,
Se le si mette vicino a una chiave di ordinamento, valgono solo per quella chiave; altrimenti valgono per tutte le chiavi che non sono state modificate “privatamente”.

-b (blanks) ignora gli spazi iniziali quando si ordinano le chiavi. Piuttosto utile quando non si sa se nel nostro file ci sono spazi oppure tab, che separano bene ma ordinano in maniera completamente diversa.
-d (directory) fa un ordinamento stile “elenco telefonico”. Vengono perciò ignorati tutti i caratteri che non siano lettere, cifre e spazi.
-f (fai uppercase) trasforma le minuscole in maiuscole, in modo che “bianco” venga prima di “NERO”. Utilissimo per ordinare liste di nomi e cognomi scritti dalla gente.
-i (ignora) usa solo i caratteri ASCII stampabili per ordinare, vale a dire quelli da 32 a 126 decimale.
-M (Mesi) fa l’ordine per mesi. Si prendono tutte le righe il campo da ordinare (reso in maiuscolo) sia l’abbreviazione di un mese, e le si ordina da JAN a DEC. Le altre righe vanno dopo.
-n (numerico) ordina in maniera numerica: quindi un campo -24.03 verrà prima di 0.2.
-r (rovescia) ordina a partire dal fondo, leggendo tutto “a rovescio”.