CLI AI

Doppelte Zeilen entfernen — mit oder ohne Sortieren

2026-08-01

sort -u file.txt entfernt doppelte Zeilen und sortiert den Rest; awk '!seen[$0]++' file.txt entfernt sie und behält die ursprüngliche Reihenfolge. Was Sie brauchen, hängt davon ab, ob die Reihenfolge Bedeutung trägt — in einem Log tut sie das immer. uniq allein leistet weder das eine noch das andere.

1. Warum uniq allein nicht hilft

clai
$ clai entferne doppelte zeilen aus access.log→ uniq access.log10.0.0.710.0.0.310.0.0.710.0.0.910.0.0.310.0.0.710.0.0.1

Die Datei kam unverändert zurück. uniq fasst nur benachbarte gleiche Zeilen zusammen, und in einer echten Datei liegen die Wiederholungen verstreut. Daher das klassische Paar sort | uniq.

2. Duplikate entfernen und sortieren

clai
$ clai entferne duplikate und sortiere die datei→ sort -u access.log10.0.0.110.0.0.310.0.0.710.0.0.9

sort -u erledigt beides in einem Durchgang — kürzer und schneller als die Pipe nach uniq.

3. Duplikate entfernen, Reihenfolge behalten

clai
$ clai entferne duplikate aber behalte die ursprüngliche zeilenreihenfolge→ awk '!seen[$0]++' access.log10.0.0.710.0.0.310.0.0.910.0.0.1

Das ist der echte Unterschied zu sort -u: das erste Vorkommen jeder Zeile bleibt, die Reihenfolge ist unangetastet — wichtig für Logs und alles, was in zeitlicher Folge geschrieben wird. Der Preis ist Speicher: awk hält jede verschiedene Zeile, was bei Dateien im Gigabytebereich auffällt.

4. Wie oft jede Zeile vorkommt

clai
$ clai zähle wie oft jede zeile vorkommt→ sort access.log | uniq -c | sort -rn      3 10.0.0.7      2 10.0.0.3      1 10.0.0.9      1 10.0.0.1

Das "Top-N"-Rezept für Logs. uniq -c zählt, das zweite sort -rn hebt die häufigen nach oben.

5. Nur die Zeilen, die sich wiederholten

clai
$ clai zeige nur zeilen die mehr als einmal vorkommen→ sort access.log | uniq -d10.0.0.310.0.0.7

-d behält nur Duplikate, -u macht das Gegenteil und behält nur Einzelstücke — hier 10.0.0.1 und 10.0.0.9. Praktisch beim Vergleich zweier Listen.

6. Nach einem Feld deduplizieren

clai
$ clai behalte eine zeile pro URL→ awk '!seen[$2]++' req.logGET /a 200GET /b 404

$2 ist das zweite Feld. So faltet man ein Log nach URL, IP oder Session-ID zusammen und behält die erste passende Zeile vollständig.

Gotchas

  • sort -u datei > datei leert die Datei. Geprüft: die Shell kürzt die Datei zum Schreiben, bevor sort sie überhaupt liest — Ergebnis null Zeilen. Richtig ist sort -u datei -o datei: sort hat ein eigenes Flag zum Zurückschreiben, und das funktioniert.
  • uniq braucht sortierte Eingabe. Ohne vorgeschaltetes sort gibt es kommentarlos fast dieselbe Datei zurück. Kein Fehler, nur eine leise falsche Antwort.
  • Reihenfolge und Sortierung sind zweierlei. sort -u liefert alphabetische Ordnung, awk '!seen[$0]++' die ursprüngliche. Für Logs wollen Sie fast immer das Zweite, gezeigt wird meist das Erste.

Related questions

Wie finde ich gemeinsame Zeilen zweier Dateien? comm -12 <(sort a.txt) <(sort b.txt). Beide Eingaben müssen sortiert sein, dafür ist die Prozesssubstitution da.

Wie ignoriere ich Groß- und Kleinschreibung? sort -uf vergleicht ohne Rücksicht darauf, awk '!seen[tolower($0)]++' genauso, nur mit erhaltener Reihenfolge.

Und wenn die Datei nicht in den Speicher passt? sort -u lagert auf temporäre Dateien aus und verkraftet Eingaben größer als der Arbeitsspeicher; die awk-Variante kann bei derselben Datei den Speicher sprengen.

See also

CliAI wählt anhand Ihrer Formulierung zwischen sortierender und reihenfolgetreuer Variante und zeigt den Befehl vorher an. In einer Zeile installieren.