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 | uniquniq <file> — Nur direkt benachbarte doppelte Zeilen entfernen (ohne zu sortieren).
uniq log.txtsort <file> | uniq > <output> — Deduplizieren und in eine neue Datei speichern.
sort emails.txt | uniq > unique-emails.txtsort -u <file> — In einem Befehl sortieren und deduplizieren (sort hat eine eingebaute Unique-Option).
sort -u names.txtZählen und Statistik
sort <file> | uniq -c — Jeder Zeile die Anzahl ihrer Vorkommen voranstellen.
sort access.log | uniq -csort <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 -20sort <file> | uniq -c | sort -n — Vorkommen zählen und nach Häufigkeit sortieren (seltenste zuerst).
sort errors.log | uniq -c | sort -nDuplikate filtern
sort <file> | uniq -d — Nur Zeilen anzeigen, die mehr als einmal vorkommen (nur Duplikate).
sort emails.txt | uniq -dsort <file> | uniq -D — Alle doppelten Zeilen anzeigen (nicht nur eine je Gruppe).
sort data.txt | uniq -Dsort <file> | uniq -u — Nur Zeilen anzeigen, die genau einmal vorkommen (nur eindeutige Zeilen).
sort entries.txt | uniq -usort <file> | uniq -cd — Duplikate mit ihrer Anzahl anzeigen.
sort urls.txt | uniq -cd | sort -rnFelder und Zeichen überspringen
uniq -f <n> — Die ersten n Felder beim Vergleich überspringen (Felder sind durch Whitespace getrennt).
sort -k2 data.txt | uniq -f 1uniq -s <n> — Die ersten n Zeichen beim Vergleich überspringen.
uniq -s 10 timestamped.loguniq -w <n> — Nur die ersten n Zeichen jeder Zeile vergleichen.
sort file.txt | uniq -w 20uniq -f <n> -s <m> -w <o> — Kombiniert: n Felder überspringen, dann m Zeichen überspringen, nur o Zeichen vergleichen.
uniq -f 2 -w 15 data.txtGroß-/Kleinschreibung
sort -f <file> | uniq -i — Deduplizieren ohne Beachtung der Groß-/Kleinschreibung (sort muss ebenfalls case-insensitiv laufen).
sort -f names.txt | uniq -isort -f <file> | uniq -ic — Vorkommen ohne Beachtung der Groß-/Kleinschreibung zählen.
sort -f words.txt | uniq -ic | sort -rnsort -f <file> | uniq -id — Duplikate ohne Beachtung der Groß-/Kleinschreibung anzeigen.
sort -f emails.txt | uniq -idTypische 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 -10cut -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 -rnsort <file1> <file2> | uniq -d — Zeilen finden, die in beiden Dateien vorkommen (Schnittmenge).
sort file1.txt file2.txt | uniq -dsort <file1> <file2> | uniq -u — Zeilen finden, die nur in einer der beiden Dateien stehen (symmetrische Differenz).
sort old-list.txt new-list.txt | uniq -usort <file1> <file1> <file2> | uniq -u — Zeilen finden, die nur in file2, aber nicht in file1 stehen.
sort old.txt old.txt new.txt | uniq -uhistory | 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 -10wc -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.
Weiterführende Links
- Wikipedia: uniq – Überblick und Funktionsweise des Kommandos
- ubuntuusers-Wiki: uniq – deutschsprachige Einführung mit Beispielen