# 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.

Source: https://www.jpkc.com/db/cheatsheets/files-text/uniq/

<!-- PROSE:intro -->
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.
<!-- PROSE:intro:end -->

## Grundlagen

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

```bash
sort names.txt | uniq
```

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

```bash
uniq log.txt
```

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

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

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

```bash
sort -u names.txt
```

## Zählen und Statistik

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

```bash
sort access.log | uniq -c
```

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

```bash
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).

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

## Duplikate filtern

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

```bash
sort emails.txt | uniq -d
```

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

```bash
sort data.txt | uniq -D
```

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

```bash
sort entries.txt | uniq -u
```

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

```bash
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).

```bash
sort -k2 data.txt | uniq -f 1
```

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

```bash
uniq -s 10 timestamped.log
```

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

```bash
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.

```bash
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).

```bash
sort -f names.txt | uniq -i
```

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

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

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

```bash
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.

```bash
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.

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

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

```bash
sort file1.txt file2.txt | uniq -d
```

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

```bash
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.

```bash
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.

```bash
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.

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

<!-- PROSE:outro -->
## 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](https://de.wikipedia.org/wiki/Uniq) – Überblick und Funktionsweise des Kommandos
- [ubuntuusers-Wiki: uniq](https://wiki.ubuntuusers.de/uniq/) – deutschsprachige Einführung mit Beispielen
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [sort](https://www.jpkc.com/db/cheatsheets/files-text/sort/) – Zeilen sortieren (Voraussetzung für uniq)
- [wc](https://www.jpkc.com/db/cheatsheets/files-text/wc/) – Zeilen, Wörter und Bytes zählen
- [cut](https://www.jpkc.com/db/cheatsheets/files-text/cut/) – Spalten und Felder aus Zeilen ausschneiden

