comm în Linux / Bash

Procesare și filtrare text POSIX / GNU coreutils

Compară două fișiere sortate și arată ce rânduri sunt doar în primul, doar în al doilea sau în amândouă.

Sintaxă comandă
comm [-1] [-2] [-3] fișier1 fișier2

Ce face comm

Comanda comm compară rând cu rând două fișiere sortate și scrie rezultatul în trei coloane: rândurile care apar doar în primul fișier, rândurile care apar doar în al doilea și rândurile comune. Coloanele sunt separate prin tab-uri.

De obicei nu ai nevoie de toate trei coloanele, așa că le ascunzi cu -1, -2 și -3. De exemplu, comm -12 arată doar rândurile comune (intersecția), iar comm -23 doar rândurile care există numai în primul fișier (diferența).

Opțiuni și argumente

Opțiune / Parametru Descriere
-1 Ascunde coloana 1 (rândurile care sunt doar în primul fișier).
-2 Ascunde coloana 2 (rândurile care sunt doar în al doilea fișier).
-3 Ascunde coloana 3 (rândurile comune).
--check-order În GNU coreutils: oprește comanda cu eroare dacă un fișier nu este sortat.

Exemple

Exemplul 1: Elevii prezenți luni și marți

Fără opțiuni, comm afișează toate cele trei coloane: Ana a fost doar luni, Elena doar marți, Bogdan și Mihai în ambele zile.

printf 'Ana\nBogdan\nMihai\n' > luni.txt
printf 'Bogdan\nElena\nMihai\n' > marti.txt
comm luni.txt marti.txt

Rezultat

Ana
		Bogdan
	Elena
		Mihai

Exemplul 2: Doar rândurile comune și doar diferența

-12 păstrează doar coloana 3 (prezenți în ambele zile); -23 păstrează doar coloana 1 (prezenți numai luni).

printf 'Ana\nBogdan\nMihai\n' > luni.txt
printf 'Bogdan\nElena\nMihai\n' > marti.txt
echo "În ambele zile:"
comm -12 luni.txt marti.txt
echo "Doar luni:"
comm -23 luni.txt marti.txt

Rezultat

În ambele zile:
Bogdan
Mihai
Doar luni:
Ana

Exemplul 3: Sortarea fișierelor înainte de comparare

Listele nesortate trebuie trecute prin sort. Substituția de proces <(...) din Bash evită fișierele temporare.

printf 'php\nnginx\ngit\n' > server1.txt
printf 'git\nphp\nredis\n' > server2.txt
echo "Pachete doar pe server2:"
comm -13 <(sort server1.txt) <(sort server2.txt)

Rezultat

Pachete doar pe server2:
redis

Greșeli frecvente

  • Rularea pe fișiere nesortate: rezultatul este greșit fără niciun avertisment clar (GNU comm doar avertizează că fișierul nu este sortat). Sortează întâi cu sort, folosind aceeași setare de limbă (LC_ALL) pentru ambele fișiere.
  • Confuzia între comm și diff: comm compară mulțimi de rânduri sortate, diff arată ce modificări transformă un fișier în celălalt, păstrând ordinea.

Comenzi înrudite

  • sort: Sortează liniile de text în ordine alfabetică, numerică sau după o coloană specifică.
  • uniq: Raportează sau elimină liniile duplicate consecutive dintr-un flux de text.
  • diff: Compară două fișiere linie cu linie și evidențiază diferențele dintre ele.
  • paste: Lipește rândurile mai multor fișiere unul lângă altul sau unește toate rândurile unui fișier într-unul singur.