Comando sort in Linux: ordinare righe, numeri e campi senza perdere dati
Il comando sort confronta le righe di testo e invia il risultato ordinato all’uscita standard, normalmente il terminale. Puoi ordinare alfabeticamente, per valore numerico, per un campo specifico o in ordine inverso. Senza un’opzione di scrittura, leggere un file con sort non ne modifica il contenuto.
L’ordine predefinito dipende dalle regole della locale, cioè dalle impostazioni linguistiche e regionali del processo. Se uno script richiede un confronto riproducibile basato sui byte, imposta LC_ALL=C. Per conservare il risultato, usa un file di destinazione diverso oppure l’opzione -o; non ridirigere l’uscita sul file che stai leggendo.
Sintassi di base
sort [OPTION]... [FILE]...
Questa è una notazione: sostituisci OPTION e FILE con opzioni e percorsi reali, senza le parentesi quadre. Senza file, o con - come nome del file, sort legge dall’ingresso standard. Implementazione e opzioni disponibili possono variare: consulta man sort sul sistema in uso. Gli esempi seguenti fanno riferimento a GNU sort.
Esempi con file pronti per l’esercitazione
Ordinamento di base e preparazione dei dati
In una shell compatibile con Bash, esegui il blocco da una directory in cui puoi creare una nuova sottodirectory. Il comando crea sort-demo e prosegue soltanto se la creazione e l’accesso riescono. Se il nome esiste già, fermati e scegli un nome diverso: non cancellare dati precedenti per ripetere la prova. I file creati sono dati dimostrativi.
mkdir sort-demo && cd sort-demo && (
set -e
set -o noclobber
export LC_ALL=C
printf 'zebra\napple\nbanana\n' > names.txt
printf '10\n2\n30\n' > scores.txt
printf 'zeta 10\nbeta 2\nalpha 2\n' > results.txt
sort names.txt
)
Le tre righe visualizzate sono apple, banana e zebra, una per riga. names.txt resta nell’ordine originale: puoi verificarlo con cat names.txt. Rimani nella directory sort-demo per i due esempi successivi. La locale impostata nel sottoprocesso vale per il primo esempio; nei successivi comandi puoi anteporre LC_ALL=C per lo stesso confronto.
Ordinamento numerico
Sui dati di scores.txt, il confronto testuale con LC_ALL=C sort scores.txt produce 10, 2 e 30. Per confrontare i valori numerici usa -n:
sort -n scores.txt
Il risultato atteso è 2, 10 e 30, ciascuno sulla propria riga. -n serve per valori decimali nel formato previsto dalla locale; per notazione scientifica o valori particolari, consulta anche -g nel manuale GNU invece di trattare tutte le forme numeriche come equivalenti.
Ordinamento in base al secondo campo
Nei dati separati da spazi di results.txt, il secondo campo contiene il punteggio. Specifica sia l’inizio sia la fine della chiave, numerando i campi da 1:
sort -k2,2n results.txt
Con LC_ALL=C, le righe risultano alpha 2, beta 2, zeta 10. Il suffisso n applica il confronto numerico al secondo campo; 2,2 evita di estendere la chiave fino alla fine della riga. Senza una stabilizzazione esplicita, GNU sort risolve le parità confrontando l’intera riga. Con LC_ALL=C sort -s -k2,2n results.txt, invece, le righe con punteggio 2 mantengono l’ordine iniziale: prima beta 2, poi alpha 2.
Per aggiungere un criterio secondario, LC_ALL=C sort -k2,2n -k1,1 results.txt ordina prima per punteggio e poi per nome. Per un separatore diverso, per esempio il punto e virgola, usa -t ';'. Il separatore è un carattere: questa opzione non trasforma sort in un interprete CSV capace di gestire campi tra virgolette contenenti il separatore.
Confrontare ingresso e risultato senza creare file
Questa prova indipendente invia tre righe a sort tramite una pipe, che collega l’uscita di printf all’ingresso del comando successivo. Nel formato di printf, ogni \n rappresenta una nuova riga. La locale è indicata sul comando che esegue il confronto.
printf 'zebra\napple\nbanana\n' | LC_ALL=C sort
Output atteso:
apple
banana
zebra
Per salvare l’ordinamento in un nuovo file della directory di esercitazione, puoi usare LC_ALL=C sort names.txt > names-sorted.txt, dopo aver verificato che il file di destinazione non contenga dati da conservare. Una ridirezione con > sovrascrive una destinazione già esistente. Non usare sort names.txt > names.txt: la shell può svuotare l’ingresso prima che sort lo legga.
Opzioni principali e formato delle chiavi
| Opzione o formato | Significato |
|---|---|
-n |
Confronta in base al valore numerico, secondo il formato riconosciuto dall’opzione e dalla locale. |
-r |
Inverte l’ordine del confronto. Per esempio, sort -nr scores.txt ordina i punteggi dal maggiore al minore. |
-k inizio,fine |
Seleziona l’intervallo della chiave. -k2,2n confronta soltanto il secondo campo come numero. |
-u |
Conserva una sola riga per ogni insieme di chiavi considerate uguali. Le altre colonne possono differire. |
-t separatore |
Usa un carattere come separatore dei campi, al posto della suddivisione predefinita basata sugli spazi. |
-s |
Disabilita il confronto finale dell’intera riga: le righe con chiavi uguali mantengono l’ordine relativo iniziale. |
-o file |
Scrive il risultato nel file indicato; in GNU sort può coincidere con l’ingresso nei casi descritti sotto. |
-c |
Controlla se l’ingresso è già ordinato senza riordinarlo; una verifica fallita produce uno stato di uscita diverso da zero. |
Precauzioni: duplicati e scrittura dei risultati
sort -u applica il criterio di confronto scelto. Per esempio, LC_ALL=C sort -u -k2,2n results.txt conserva una sola delle righe con punteggio 2, anche se i nomi sono diversi. Usalo soltanto se vuoi eliminare proprio quei duplicati di chiave. Per conservare tutte le righe e mantenerne l’ordine nelle parità, usa invece -s.
Il comando uniq, descritto nella guida in inglese elimina le ripetizioni adiacenti e, nell’uso predefinito, conserva l’ordine delle righe rimaste. Non esegue un ordinamento e non elimina da solo ripetizioni distanti. Se vuoi rimuovere tutte le righe identiche senza conservare l’ordine iniziale, valuta l’ordinamento seguito dalla deduplicazione.
Per GNU sort, gli stati di uscita sono 0 per successo, 1 quando una verifica con -c trova un disordine e 2 per un errore. Uno script deve distinguere una verifica fallita da un file non leggibile. L’ordine di confronto deve essere lo stesso sia nell’ordinamento sia nella verifica.
Domande frequenti
Come posso salvare il risultato nel file originale?
Con GNU sort puoi usare LC_ALL=C sort -o names.txt names.txt: nell’ordinamento normale, legge l’ingresso prima di aprire l’uscita. Conserva prima un backup dei file importanti e controlla il risultato. Questa proprietà non è una garanzia di aggiornamento atomico o di recupero in caso di interruzione; se usi l’opzione di fusione -m, consulta i vincoli del manuale e preferisci una destinazione separata.
Documentazione di riferimento
La pagina di manuale di GNU sort, pubblicata su man7 descrive opzioni, chiavi e influenza della locale. Il riferimento POSIX per sort permette di distinguere le funzionalità standard dalle estensioni specifiche dell’implementazione.




