uniq

Usuwa lub zlicza powtarzające się sąsiednie linie w pliku.

uniq to narzędzie, które filtruje albo zlicza powtarzające się sąsiednie linie w tekście. Jeśli masz plik czy strumień, w którym te same wiersze występują jeden po drugim, uniq zostawi po nich tylko jedną kopię, policzy je albo pokaże wyłącznie te powtórzone. Kluczowe słowo to sąsiednieuniq nie skanuje całego pliku w poszukiwaniu duplikatów, patrzy tylko na wiersz poprzedni. Dlatego prawie zawsze pojawia się w duecie z sort.

Składnia i najważniejsze opcje

Podstawowa forma to uniq [OPCJE] [PLIK_WEJŚCIOWY [PLIK_WYJŚCIOWY]]. Bez podania pliku uniq czyta ze standardowego wejścia, więc świetnie działa w potoku.

  • -c, --count — poprzedza każdą linię liczbą jej wystąpień.
  • -d, --repeated — pokazuje tylko linie powtórzone (po jednej na grupę).
  • -u, --unique — pokazuje wyłącznie linie, które nie mają duplikatu.
  • -D — wypisuje wszystkie wiersze z każdej powtórzonej grupy (nie tylko jeden).
  • -i, --ignore-case — ignoruje wielkość liter przy porównaniu.
  • -f N, --skip-fields=N — pomija pierwsze N pól (kolumn) przy porównaniu.
  • -s N, --skip-chars=N — pomija pierwsze N znaków przy porównaniu.
  • -w N, --check-chars=N — porównuje tylko pierwsze N znaków każdej linii.

Przykłady użycia

sort log.txt | uniq — sortuje plik, a potem zwija sąsiednie duplikaty w pojedyncze wiersze. To najczęstszy schemat.

sort access.log | uniq -c | sort -rn — zlicza wystąpienia każdej linii i sortuje malejąco, więc na górze lądują najczęstsze wpisy. Klasyk do analizy logów.

sort emails.txt | uniq -d — wypisuje tylko adresy, które pojawiły się więcej niż raz. Idealne do wyłapania duplikatów.

sort names.txt | uniq -u — pokazuje wyłącznie linie unikalne, czyli takie bez żadnego bliźniaka w pliku.

uniq -f 1 dane.txt — porównuje wiersze z pominięciem pierwszej kolumny, przydatne gdy na początku masz np. numer albo znacznik czasu, który chcesz zignorować.

Częste błędy i pułapki

Numer jeden na liście wpadek: zapominanie o sort. Jeśli duplikaty w pliku nie leżą obok siebie, uniq ich nie zauważy — porówna tylko sąsiadów. Efekt: uruchamiasz samo uniq, widzisz „powtórki” na wyjściu i głowisz się, czemu polecenie „nie działa”. Działa, po prostu robi dokładnie to, co obiecuje.

Druga sprawa: -c dokleja liczbę z wcięciem na początku linii, więc jeśli potem parsujesz wynik, pamiętaj o wiodących spacjach. Uważaj też, że -d i -u to przeciwieństwa — użyte razem zwykle nie dają nic sensownego. Na macOS/BSD uniq nie ma długich opcji typu --count (tylko krótkie -c), a składnia liczników przy -f i -s potrafi się różnić od GNU coreutils, więc na Macu sprawdź man uniq, zanim skopiujesz gotowca z linuksowego tutoriala.

Powiązane komendy: sort, sort -u, cut, awk, wc, comm.