Comando comm in Linux: confrontare righe comuni e differenze tra file ordinati
comm confronta due file già ordinati e distingue tre categorie: righe presenti solo nel primo, solo nel secondo e in entrambi. Le opzioni -1, -2 e -3 nascondono le rispettive colonne, permettendo di estrarre le differenze o le righe comuni.
Il confronto riguarda righe intere, non chiavi all’interno dei campi. Per ricostruire modifiche in base alla posizione nel testo, usa invece la guida a diff. Prima di usare comm, ordina entrambi gli input con le stesse regole locali del confronto.
Sintassi di base
comm [OPTION]... FILE1 FILE2
La riga mostra la sintassi: sostituisci i segnaposto con opzioni e nomi reali, senza le parentesi quadre. Uno dei due file può essere - per leggere lo standard input; non usare - per entrambi. Opzioni aggiuntive come --check-order appartengono a GNU: controlla man comm nella tua installazione.
Preparare i file e scegliere le righe da mostrare
Vedere tutte e tre le categorie
Il blocco seguente prepara gli input e le copie ordinate in una directory nuova, poi esegue il confronto. Usa una shell compatibile con Bash con GNU sort e comm disponibili. Se comm-demo esiste già, il blocco si ferma senza eseguire il resto: scegli un altro nome, conservando i file precedenti.
mkdir comm-demo && cd comm-demo && (
set -e
set -o noclobber
printf 'banana\napple\n' > old.txt
printf 'cherry\nbanana\n' > new.txt
LC_ALL=C sort old.txt > old.sorted
LC_ALL=C sort new.txt > new.sorted
LC_ALL=C comm --check-order old.sorted new.sorted
)
Il risultato contiene tre righe, nell’ordine: apple senza tabulazioni iniziali, banana preceduta da due tabulazioni e cherry preceduta da una tabulazione. Rappresentano rispettivamente un valore solo nel primo file, un valore comune e un valore solo nel secondo. Le categorie sono colonne logiche: non vengono raggruppate in tre blocchi separati.
Le tabulazioni reali spostano il testo a posizioni diverse secondo il terminale. Per renderle visibili in un ambiente GNU puoi eseguire LC_ALL=C comm --check-order old.sorted new.sorted | cat -T: ^I indica ciascuna tabulazione. Quindi vedrai apple, ^I^Ibanana e ^Icherry. Rimani nella directory comm-demo per i due comandi successivi.
Mostrare soltanto le righe comuni
Nascondi le colonne 1 e 2 con -12:
LC_ALL=C comm --check-order -12 old.sorted new.sorted
L’output è banana, seguito da una nuova riga. Poiché le altre due colonne sono nascoste, non vengono aggiunte le due tabulazioni iniziali del formato completo.
Mostrare soltanto le righe del secondo file
Nascondi la colonna 1 e quella comune, la 3:
LC_ALL=C comm --check-order -13 old.sorted new.sorted
Ottieni cherry. Per l’operazione inversa, le righe solo nel primo file, usa -23: sui dati di prova il risultato è apple. -3 mantiene entrambe le categorie esclusive, distinguendole ancora con la tabulazione della seconda colonna.
Una prova indipendente sulle righe comuni
Questo secondo blocco crea una directory nuova e due file che sono già ordinati secondo LC_ALL=C. Eseguilo per intero: se la directory comm-small esiste, scegli un nome nuovo. I comandi fra parentesi tonde lavorano in una subshell, quindi al termine rimani nella directory da cui hai lanciato il blocco.
(
set -e
mkdir comm-small
cd comm-small
set -o noclobber
printf 'apple\nbanana\n' > first.txt
printf 'banana\ncherry\n' > second.txt
LC_ALL=C comm --check-order -12 first.txt second.txt
)
Output atteso:
banana
La precondizione riguarda l’ordinamento nell’ambiente locale del comando, non l’aspetto alfabetico del testo. Per file reali crea copie con LC_ALL=C sort input.txt > input.sorted, usando un nome nuovo, e confrontale ancora con LC_ALL=C comm. La guida a sort approfondisce la scelta dell’ordinamento; ordinare numericamente o per un solo campo non sostituisce l’ordinamento delle righe intere richiesto qui.
Opzioni e colonne del risultato
| Opzione | Effetto |
|---|---|
-1 |
Nasconde le righe presenti solo nel primo file e il separatore della relativa colonna. |
-2 |
Nasconde le righe presenti solo nel secondo file e il separatore della relativa colonna. |
-3 |
Nasconde le righe comuni ai due file. |
--check-order |
Nell’implementazione GNU segnala un errore se trova input non ordinati, anche quando tutte le righe sono abbinabili. |
I numeri delle opzioni indicano colonne da eliminare, non colonne da tenere. Puoi combinarli: -123 nasconde tutto. Quando resta una sola categoria, non ci sono tabulazioni di allineamento aggiunte davanti alle sue righe. Eventuali tabulazioni già contenute nei dati restano invece parte del contenuto.
Precauzioni: locale, duplicati e codice di uscita
Usa lo stesso ambiente locale per sort e comm. GNU --check-order aiuta a individuare errori, ma il comando può avere già prodotto parte dell’output prima di interrompersi. Se fallisce, scarta quel risultato, correggi gli input e ripeti il confronto. Non usare --nocheck-order come rimedio per dati non ordinati; eliminare il controllo non rende valido il confronto.
Decidi prima che cosa significano le ripetizioni. Se apple compare due volte nel primo file e una nel secondo, una occorrenza è comune e una resta nella categoria del primo file. comm non produce una tabella di conteggi per chiave. Se vuoi soltanto la presenza o assenza di valori distinti, prepara entrambi i file con LC_ALL=C sort -u; questa scelta elimina le ripetizioni e non è adatta se le quantità hanno un significato.
Una differenza fra i file non provoca di per sé un codice di errore: comm termina con codice 0 quando l’elaborazione riesce, anche se trova righe esclusive. Un codice diverso da zero indica un errore. Per verificare se gli insiemi di righe differiscono, esamina l’output appropriato, per esempio quello di -3; non interpretare il solo successo del comando come prova di uguaglianza.
Per salvare le righe comuni nella directory del primo esempio usa LC_ALL=C comm --check-order -12 old.sorted new.sorted > common.txt, scegliendo una destinazione nuova e controllando sia il successo del comando sia cat common.txt. La redirezione può sovrascrivere file esistenti. Non usare uno degli input come destinazione: la shell può svuotarlo prima della lettura. Gli originali e le copie ordinate devono avere nomi distinti dal risultato.
Domande frequenti
Che cosa indicano le tre colonne di comm?
La prima contiene le righe solo nel primo file, la seconda quelle solo nel secondo e la terza quelle comuni. Nel formato completo sono precedute rispettivamente da zero, una e due tabulazioni. Nascondere una colonna elimina anche il relativo separatore; per questo -12 mostra le righe comuni senza l’allineamento iniziale.
Documentazione di riferimento
La pagina di manuale GNU di comm su man7 descrive le opzioni della versione documentata. Il riferimento POSIX per comm specifica colonne, separatori, ordinamento e codici di uscita.




