uniq — Doppelte Zeilen filtern und zählen

Praxis-Guide zu uniq: benachbarte doppelte Zeilen entfernen, Vorkommen zählen sowie Duplikate und Unikate finden — meist im Gespann mit sort.

uniq filtert doppelte Zeilen aus einem Text – aber nur, wenn sie direkt aufeinanderfolgen. Genau hier liegt die häufigste Stolperfalle: uniq vergleicht ausschließlich benachbarte Zeilen, deshalb muss die Eingabe in aller Regel zuerst durch sort laufen. Ist das erledigt, zählt uniq Vorkommen (-c), zeigt nur Duplikate (-d) oder nur Einzelstücke (-u) und beherrscht das Überspringen von Feldern und Zeichen. In Pipelines mit sort ist uniq das Standardwerkzeug für Häufigkeitsanalysen von Logs und Listen. Dieser Guide führt dich durch die wichtigsten Optionen.

Grundlagen

sort <file> | uniq — Doppelte Zeilen entfernen (Eingabe muss zuvor sortiert sein).

sort names.txt | uniq

uniq <file> — Nur direkt benachbarte doppelte Zeilen entfernen (ohne zu sortieren).

uniq log.txt

sort <file> | uniq > <output> — Deduplizieren und in eine neue Datei speichern.

sort emails.txt | uniq > unique-emails.txt

sort -u <file> — In einem Befehl sortieren und deduplizieren (sort hat eine eingebaute Unique-Option).

sort -u names.txt

Zählen und Statistik

sort <file> | uniq -c — Jeder Zeile die Anzahl ihrer Vorkommen voranstellen.

sort access.log | uniq -c

sort <file> | uniq -c | sort -rn — Vorkommen zählen und nach Häufigkeit sortieren (häufigste zuerst).

cut -f 1 -d ' ' access.log | sort | uniq -c | sort -rn | head -20

sort <file> | uniq -c | sort -n — Vorkommen zählen und nach Häufigkeit sortieren (seltenste zuerst).

sort errors.log | uniq -c | sort -n

Duplikate filtern

sort <file> | uniq -d — Nur Zeilen anzeigen, die mehr als einmal vorkommen (nur Duplikate).

sort emails.txt | uniq -d

sort <file> | uniq -D — Alle doppelten Zeilen anzeigen (nicht nur eine je Gruppe).

sort data.txt | uniq -D

sort <file> | uniq -u — Nur Zeilen anzeigen, die genau einmal vorkommen (nur eindeutige Zeilen).

sort entries.txt | uniq -u

sort <file> | uniq -cd — Duplikate mit ihrer Anzahl anzeigen.

sort urls.txt | uniq -cd | sort -rn

Felder und Zeichen überspringen

uniq -f <n> — Die ersten n Felder beim Vergleich überspringen (Felder sind durch Whitespace getrennt).

sort -k2 data.txt | uniq -f 1

uniq -s <n> — Die ersten n Zeichen beim Vergleich überspringen.

uniq -s 10 timestamped.log

uniq -w <n> — Nur die ersten n Zeichen jeder Zeile vergleichen.

sort file.txt | uniq -w 20

uniq -f <n> -s <m> -w <o> — Kombiniert: n Felder überspringen, dann m Zeichen überspringen, nur o Zeichen vergleichen.

uniq -f 2 -w 15 data.txt

Groß-/Kleinschreibung

sort -f <file> | uniq -i — Deduplizieren ohne Beachtung der Groß-/Kleinschreibung (sort muss ebenfalls case-insensitiv laufen).

sort -f names.txt | uniq -i

sort -f <file> | uniq -ic — Vorkommen ohne Beachtung der Groß-/Kleinschreibung zählen.

sort -f words.txt | uniq -ic | sort -rn

sort -f <file> | uniq -id — Duplikate ohne Beachtung der Groß-/Kleinschreibung anzeigen.

sort -f emails.txt | uniq -id

Typische Muster

awk '{print $1}' <log> | sort | uniq -c | sort -rn | head -10 — Die zehn häufigsten IPs in einem Access-Log.

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

cut -f <n> -d '<d>' <file> | sort | uniq -c | sort -rn — Häufigkeitsanalyse einer bestimmten Spalte.

cut -f 3 -d ',' sales.csv | sort | uniq -c | sort -rn

sort <file1> <file2> | uniq -d — Zeilen finden, die in beiden Dateien vorkommen (Schnittmenge).

sort file1.txt file2.txt | uniq -d

sort <file1> <file2> | uniq -u — Zeilen finden, die nur in einer der beiden Dateien stehen (symmetrische Differenz).

sort old-list.txt new-list.txt | uniq -u

sort <file1> <file1> <file2> | uniq -u — Zeilen finden, die nur in file2, aber nicht in file1 stehen.

sort old.txt old.txt new.txt | uniq -u

history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10 — Die zehn am häufigsten verwendeten Shell-Befehle anzeigen.

history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10

wc -l <file> && sort -u <file> | wc -l — Gesamtzeilen mit eindeutigen Zeilen vergleichen, um die Dublettenmenge abzuschätzen.

echo "Total: $(wc -l < data.txt)  Unique: $(sort -u data.txt | wc -l)"

Fazit

Merk dir die goldene Regel: uniq ohne vorheriges sort entfernt nur unmittelbar benachbarte Dubletten und übersieht alles, was weiter auseinanderliegt – fast immer willst du also sort | uniq oder gleich sort -u. Für reine Deduplizierung ist sort -u kürzer; sobald du aber zählen (-c), nur Duplikate (-d) oder nur Unikate (-u) brauchst, führt kein Weg an uniq vorbei. Bei Vergleichen mit -f, -s oder -w müssen sich Sortierschlüssel (sort) und Vergleichsschlüssel (uniq) decken, sonst werden vermeintliche Dubletten nicht erkannt.

Verwandte Kommandos

  • sort – Zeilen sortieren (Voraussetzung für uniq)
  • wc – Zeilen, Wörter und Bytes zählen
  • cut – Spalten und Felder aus Zeilen ausschneiden