# sort — Textzeilen sortieren und deduplizieren

> Praxis-Guide zu sort: Textzeilen alphabetisch, numerisch oder nach Version sortieren — mit Schlüsseln, Feldern, Locale und Tuning für große Dateien.

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

<!-- PROSE:intro -->
sort ordnet die Zeilen einer Datei oder eines Datenstroms – standardmäßig alphabetisch, auf Wunsch aber auch numerisch, nach Version, nach Monatsnamen oder nach menschenlesbaren Größen wie 2K oder 1G. Über Schlüssel (`-k`) und einen frei wählbaren Feldtrenner (`-t`) sortierst du gezielt nach einzelnen Spalten, etwa in CSV-Dateien oder Logs. In Pipelines bildet sort zusammen mit `uniq` das klassische Duo für Häufigkeitsanalysen. Für riesige Dateien kannst du Speicherpuffer, Temp-Verzeichnis und sogar parallele Verarbeitung steuern. Dieser Guide zeigt dir die Optionen, die du im Alltag wirklich brauchst.
<!-- PROSE:intro:end -->

## Grundlagen

`sort <file>` — Zeilen alphabetisch sortieren (Standard: aufsteigend, Groß-/Kleinschreibung beachtend).

```bash
sort names.txt
```

`sort -r <file>` — In umgekehrter (absteigender) Reihenfolge sortieren.

```bash
sort -r names.txt
```

`sort -o <output> <file>` — Ergebnis in eine Datei schreiben. Ein- und Ausgabedatei dürfen identisch sein.

```bash
sort -o sorted.txt data.txt
```

`sort -u <file>` — Sortieren und doppelte Zeilen entfernen (unique).

```bash
sort -u emails.txt
```

`sort -c <file>` — Prüfen, ob eine Datei bereits sortiert ist. Gibt die erste unsortierte Zeile aus und endet mit Fehler.

```bash
sort -c data.txt
```

## Sortiermodi

`sort -n <file>` — Numerisch statt alphabetisch sortieren.

```bash
sort -n scores.txt
```

`sort -h <file>` — Nach menschenlesbaren Zahlen sortieren (z. B. 2K, 1G, 3M).

```bash
du -sh * | sort -h
```

`sort -V <file>` — Versionsnummern natürlich sortieren (z. B. 1.2 < 1.10).

```bash
sort -V versions.txt
```

`sort -M <file>` — Nach Monatsnamen sortieren (Jan < Feb < Mar ...).

```bash
sort -M months.txt
```

`sort -R <file>` — In zufälliger Reihenfolge sortieren (Zeilen mischen).

```bash
sort -R playlist.txt
```

`sort -g <file>` — Nach allgemeinem Zahlenwert sortieren. Unterstützt wissenschaftliche Notation (z. B. 1.5e3).

```bash
sort -g measurements.txt
```

## Schlüssel und Felder

`sort -k <field> <file>` — Nach einem bestimmten Feld sortieren (1-basiert). Standardtrenner ist Whitespace.

```bash
sort -k 2 data.txt
```

`sort -k <start>,<end> <file>` — Nach einem Feldbereich von Anfang bis Ende (inklusive) sortieren.

```bash
sort -k 2,2 data.txt
```

`sort -t '<sep>' -k <field> <file>` — Feldtrenner festlegen und nach einem bestimmten Feld sortieren.

```bash
sort -t ',' -k 3 data.csv
```

`sort -t ':' -k 3 -n <file>` — Nach dem Zahlenwert eines bestimmten Felds mit eigenem Trenner sortieren.

```bash
sort -t ':' -k 3 -n /etc/passwd
```

`sort -k <field>n <file>` — Ein bestimmtes Feld numerisch sortieren. Der Modifikator wird an den Schlüssel angehängt.

```bash
sort -k 2n scores.txt
```

`sort -k <f1>,<f1> -k <f2>,<f2>n <file>` — Nach mehreren Schlüsseln sortieren. Der erste Schlüssel ist primär, der zweite sekundär.

```bash
sort -k 1,1 -k 2,2n students.txt
```

## Groß-/Kleinschreibung und Locale

`sort -f <file>` — Klein- in Großbuchstaben falten (Sortierung ohne Beachtung der Groß-/Kleinschreibung).

```bash
sort -f mixed-case.txt
```

`sort -d <file>` — Wörterbuch-Reihenfolge. Nur Leerzeichen und alphanumerische Zeichen berücksichtigen.

```bash
sort -d words.txt
```

`sort -i <file>` — Nicht druckbare Zeichen beim Sortieren ignorieren.

```bash
sort -i data.txt
```

`LC_ALL=C sort <file>` — Nach Byte-Werten sortieren (C-Locale). Schneller und systemübergreifend konsistent.

```bash
LC_ALL=C sort large-file.txt
```

## Leerzeichen und Stabilität

`sort -b <file>` — Führende Leerzeichen bei der Schlüsselbestimmung ignorieren.

```bash
sort -b indented.txt
```

`sort -s <file>` — Stabile Sortierung. Erhält die ursprüngliche Reihenfolge von Zeilen mit gleichem Schlüssel.

```bash
sort -s -k 1,1 data.txt
```

`sort -z <file>` — NUL statt Zeilenumbruch als Zeilentrenner verwenden. Nützlich mit find -print0.

```bash
find . -print0 | sort -z
```

## Zusammenführen und große Dateien

`sort -m <file1> <file2>` — Bereits sortierte Dateien zusammenführen, ohne neu zu sortieren.

```bash
sort -m sorted1.txt sorted2.txt
```

`sort -S <size> <file>` — Eine bestimmte Menge Speicher für den Sortierpuffer verwenden.

```bash
sort -S 2G huge-file.txt
```

`sort -T <dir> <file>` — Ein bestimmtes Verzeichnis für temporäre Dateien statt /tmp verwenden.

```bash
sort -T /data/tmp huge-file.txt
```

`sort --parallel=<n> <file>` — Bis zu N Sortierungen gleichzeitig ausführen (GNU sort).

```bash
sort --parallel=4 huge-file.txt
```

## Pipelines

`<command> | sort` — Die Ausgabe eines beliebigen Befehls sortieren.

```bash
ls -1 | sort
```

`<command> | sort -n` — Befehlsausgabe numerisch sortieren.

```bash
wc -l *.txt | sort -n
```

`<command> | sort | uniq -c | sort -rn` — Vorkommen zählen und das häufigste zuerst anzeigen.

```bash
awk '{print $1}' access.log | sort | uniq -c | sort -rn
```

`<command> | sort -u` — Ausgabe in einem Schritt sortieren und deduplizieren.

```bash
cat file1.txt file2.txt | sort -u
```

`<command> | sort -t '<sep>' -k <field> -rn | head -n <count>` — Die Top-N-Einträge nach einem numerischen Feld ermitteln.

```bash
du -s */ | sort -rn | head -n 10
```

## Typische Muster

`sort -t ',' -k 2,2 -k 3,3n <file>` — CSV nach Spalte 2 (alphabetisch), dann Spalte 3 (numerisch) sortieren.

```bash
sort -t ',' -k 2,2 -k 3,3n employees.csv
```

`sort -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n <file>` — IP-Adressen numerisch nach jedem Oktett sortieren.

```bash
sort -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n ips.txt
```

`sort -rn <file> | head -n 1` — Den größten Zahlenwert in einer Datei finden.

```bash
sort -rn numbers.txt | head -n 1
```

`sort <file1> <file2> | uniq -d` — Gemeinsame Zeilen zweier Dateien finden.

```bash
sort users1.txt users2.txt | uniq -d
```

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

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

`tail -n +2 <file> | sort -t ',' -k <field>n` — Eine CSV-Datei nach einer numerischen Spalte sortieren, die Kopfzeile überspringen.

```bash
tail -n +2 sales.csv | sort -t ',' -k 3n
```

<!-- PROSE:outro -->
## Fazit

sort ist eines der vielseitigsten Textwerkzeuge der Shell und kombiniert sich nahtlos mit `uniq`, `head` und `cut`. Achte auf die Locale: In einer UTF-8-Umgebung sortiert sort anders als mit `LC_ALL=C`, was zu überraschenden Reihenfolgen und spürbaren Geschwindigkeitsunterschieden führen kann – für reproduzierbare, schnelle Ergebnisse stellst du `LC_ALL=C` voran. Mit `-o` kannst du gefahrlos in dieselbe Datei zurückschreiben; ein einfaches `>` würde die Eingabe dagegen leeren, bevor sort sie liest. Und denk daran: Ein nachgeschaltetes `uniq` entfernt nur direkt benachbarte Dubletten, weshalb davor fast immer ein sort gehört.

## Weiterführende Links

- [GNU-Coreutils-Handbuch: sort](https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html) – vollständige Referenz aller Optionen (englisch)
- [Wikipedia: sort (Unix)](https://de.wikipedia.org/wiki/Sort_(Unix)) – Hintergrund und Geschichte des Kommandos
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [uniq](https://www.jpkc.com/db/cheatsheets/files-text/uniq/) – benachbarte doppelte Zeilen filtern und zählen
- [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

