VMware ESXi and vSphere Cluster Management

Dateien und Textspalten mit Linux sort sortieren

Lerne, wie du Linux-Dateien und Befehlsausgaben mit sort alphabetisch, numerisch, nach Spalten und Versionsnummern sortierst.

Der Linux-Befehl sort ordnet Zeilen aus Dateien oder aus der Standardeingabe. Die Standardausgabe ist das normale Ausgabeziel eines Kommandos, meistens das Terminal. Die Quelldatei bleibt dabei normalerweise unverändert.

Mit sort kannst du beispielsweise Namen alphabetisch ordnen, Textspalten vergleichen, Zahlen numerisch sortieren oder eine Befehlsausgabe in einer Pipeline weiterverarbeiten.

Grundsyntax und Zweck von sort

sort [Optionen] [Datei ...]

Ohne angegebene Datei liest sort aus der Standardeingabe. Dadurch kann die Ausgabe eines anderen Kommandos über eine Pipeline als Eingabe dienen:

printf '%s\n' Birne Apfel Kirsche | sort

Du kannst auch mehrere Dateien angeben. Ihre Zeilen werden gemeinsam gelesen und als eine sortierte Ausgabe ausgegeben:

sort januar.txt februar.txt

sort schreibt das Ergebnis standardmäßig auf die Standardausgabe. Es verändert die Eingabedateien nicht automatisch.

Alphabetische Standardsortierung

Angenommen, namen.txt enthält:

Clara
Anton
Beate
David

Die ursprüngliche Reihenfolge ist nicht alphabetisch. Mit folgendem Befehl wird jede Zeile lexikografisch sortiert:

sort namen.txt

Die Ausgabe lautet typischerweise:

Anton
Beate
Clara
David

Lexikografisch bedeutet, dass Text Zeichen für Zeichen nach der aktiven Zeichenreihenfolge verglichen wird. Die Ausgabe erscheint auf dem Terminal; namen.txt bleibt unverändert.

Umgekehrte Reihenfolge mit -r

Die Option -r kehrt die ermittelte Sortierreihenfolge um:

sort -r namen.txt
David
Clara
Beate
Anton

-r kann mit einem Sortierschlüssel und anderen Vergleichsarten kombiniert werden. Das folgende Beispiel sortiert nach dem zweiten Feld numerisch und gibt die Reihenfolge absteigend aus:

sort -k 2,2nr personen.txt

Nach Feldern oder Spalten sortieren

Eine Eingabezeile kann aus mehreren Feldern bestehen. Ein Feld ist ein Teil der Zeile, der durch Leerraum oder ein festgelegtes Trennzeichen abgegrenzt wird. Mit -k wählst du den Sortierschlüssel aus: Das ist das Feld oder der Feldbereich, dessen Inhalt die Reihenfolge bestimmt.

Die Feldnummerierung beginnt bei 1, nicht bei 0. Bei standardmäßig leerraumgetrennten Daten kann eine Datei so aussehen:

Clara Berlin
Anton Hamburg
Beate Köln
David Berlin

Nach dem zweiten Feld, also dem Ort, sortierst du so:

sort -k 2 personen.txt

Ein einzelnes Feld solltest du oft als Bereich mit identischem Anfang und Ende schreiben:

sort -k 2,2 personen.txt

-k 2 bezeichnet den Schlüssel ab Feld 2 bis zum Ende der Zeile, während -k 2,2 ausdrücklich nur Feld 2 verwendet. Die genaue Schlüsselbegrenzung macht Befehle verständlicher und verhindert unerwartete Vergleiche weiterer Textteile.

Mehrere Sortierschlüssel

Mehrere -k-Angaben werden in ihrer Reihenfolge ausgewertet. Zuerst wird der primäre Schlüssel verglichen. Bei Gleichstand entscheidet der nächste Schlüssel.

sort -k 2,2 -k 1,1 personen.txt

Hier wird zuerst nach Nachname beziehungsweise Feld 2 und bei gleichem Nachnamen nach Feld 1 sortiert. Optionen wie n gehören direkt an den jeweiligen Schlüssel:

sort -k 1,1 -k 2,2n artikel.txt

Damit kann beispielsweise zuerst nach einer Kategorie als Text und innerhalb jeder Kategorie nach einer Nummer sortiert werden.

Feldtrenner mit -t

Bei der Standardsortierung wird zusammenhängender Leerraum als Feldtrennung behandelt. Für andere Datenformate legst du mit -t ein einzelnes Trennzeichen fest.

Passwortdatei-ähnliche Daten verwenden häufig einen Doppelpunkt:

anna:x:1002:100:Anna Beispiel
berta:x:1001:100:Berta Beispiel
claus:x:1005:100:Claus Beispiel

Nach der dritten, numerischen Spalte sortierst du so:

sort -t ':' -k 3,3n konten.txt

Semikolongetrennte Daten werden entsprechend mit -t ';' verarbeitet:

sort -t ';' -k 2,2n messwerte.txt

Auch einfache CSV-ähnliche Zeilen können so behandelt werden:

sort -t ',' -k 2,2n daten.csv

Das ist jedoch nur für einfache Zeilen zuverlässig. CSV kann Anführungszeichen, eingebettete Kommas und Zeilenumbrüche enthalten. Für solche Dateien ist ein spezialisiertes CSV-Werkzeug zuverlässiger als sort, weil sort keine vollständige CSV-Syntax versteht.

Textuelle und numerische Sortierung

Ohne Option vergleicht sort Werte als Text. Deshalb kann eine Zahlenliste überraschend aussehen:

printf '%s\n' 2 10 100 | sort
10
100
2

Für Ganzzahlen verwendest du -n:

sort -n zahlen.txt

Mit einem numerischen Spaltenschlüssel wird die Option an den Schlüssel angehängt:

sort -k 2,2n werte.txt

Die Option -h versteht menschenlesbare Größen mit Einheiten wie K, M und G:

sort -h groessen.txt

Damit wird beispielsweise 900K vor 2M und 1G eingeordnet. Für Versionsangaben ist -V gedacht:

sort -V versionen.txt

Eine Versionssortierung ordnet etwa 1.9 vor 1.10, statt die Werte wie gewöhnlichen Text zu behandeln.

EingabewerteUngeeignete oder überraschende StandardsortierungPassende OptionErwartete fachliche Reihenfolge
Ganzzahlen10 vor 2-n2, 10, 100
Menschenlesbare DateigrößenEinheiten werden als Text behandelt-h900K, 2M, 1G
Versionsnummern1.10 kann vor 1.9 erscheinen-V1.9, 1.10, 1.11
Groß- und kleingeschriebene WörterGroß- und Kleinbuchstaben werden unterschiedlich verglichen-fVergleich ohne Berücksichtigung der Großschreibung

Wichtige Optionen von sort

OptionZweckTypischer Einsatz
-rUmgekehrte ReihenfolgeAbsteigende alphabetische oder numerische Ausgabe
-kSortierschlüssel auswählen-k 2,2 für Feld 2
-tEigenen Feldtrenner festlegen-t ':' für Doppelpunktdaten
-nNumerisch vergleichenGanzzahlen und numerische Spalten
-hMenschenlesbare Größen vergleichenK, M und G
-VVersionssortierungSoftwareversionen
-cSortierreihenfolge prüfen und Abweichung meldenValidierung in Skripten
-CSortierreihenfolge still prüfenNur den Exit-Status auswerten
-uGleiche Einträge nur einmal ausgebenSortierendes Entfernen von Duplikaten
-sStabile Sortierung erzwingenOriginalreihenfolge bei gleichen Schlüsseln bewahren
-fGroß- und Kleinschreibung beim Vergleich ignorierenNamen unabhängig von Schreibweise ordnen
-oAusgabe in eine Datei schreibenEingabedatei sicher durch sortierte Ausgabe ersetzen

Sortierreihenfolge prüfen: -c und -C

Mit -c prüfst du, ob eine Datei bereits entsprechend den angegebenen Sortieroptionen geordnet ist:

sort -c -k 2,2n werte.txt

Ist die Reihenfolge korrekt, bleibt die Ausgabe normalerweise leer und der Exit-Status ist erfolgreich. Bei einer Abweichung meldet sort die erste fehlerhafte Stelle. Der Exit-Status ist der Rückgabewert eines Kommandos und kann in Shell-Skripten ausgewertet werden.

if sort -C -k 2,2n werte.txt; then
    echo "Reihenfolge ist korrekt"
else
    echo "Datei ist nicht korrekt sortiert"
fi

-C ist die stille Variante: Sie gibt keine Diagnose aus und liefert nur den passenden Exit-Status. Wichtig ist, beim Prüfen exakt dieselben Schlüssel-, Zahlen-, Trenner- und Locale-Optionen zu verwenden wie beim Erzeugen der Datei.

Ausgabe speichern und weiterverarbeiten

Mit der Standardausgabeumleitung > speicherst du das Ergebnis in einer neuen Datei:

sort daten.txt > daten-sortiert.txt

Auch Pipelines sind typisch:

journalctl -n 100 | sort | less

Verwende nicht einfach dieselbe Datei als Eingabe und Ziel einer Umleitung:

sort daten.txt > daten.txt

Die Shell öffnet und kürzt die Zieldatei, bevor sort sie vollständig lesen kann. Dadurch kann die Datei leer oder unvollständig werden.

Die Option -o lässt sort die Ausgabedatei selbst verwalten. Daher ist auch das Ersetzen der Eingabedatei möglich:

sort -o daten.txt daten.txt

Doppelte Zeilen und stabile Reihenfolge

-u sortiert und unterdrückt gleiche Einträge:

sort -u eintraege.txt

Ohne weitere Schlüsseloptionen bedeutet das: vollständig identische Zeilen werden zusammengefasst. Zeilen können jedoch unterschiedliche Inhalte haben und trotzdem denselben ausgewählten Schlüssel besitzen. Wenn du beispielsweise mit -k 2,2 sortierst, ist für -u die Vergleichsdefinition mit diesem Schlüssel relevant. Prüfe deshalb, ob du ganze Zeilen oder Schlüsselwerte eindeutig machen möchtest.

Bei gleichen Sortierschlüsseln kann eine stabile Sortierung wichtig sein. -s bewahrt die ursprüngliche Reihenfolge von Zeilen, deren Schlüssel gleich ist:

sort -s -k 2,2 personen.txt

Ohne -s können bei gleichem Hauptschlüssel weitere Teile der Zeile zur Auflösung des Gleichstands herangezogen werden.

Großschreibung, Zeichenreihenfolge und Locale

Eine Locale enthält umgebungsabhängige Sprach- und Sortierregeln. Sie beeinflusst unter anderem, wie Buchstaben, Sonderzeichen und Umlaute eingeordnet werden. Deshalb kann dieselbe Datei auf zwei Systemen unterschiedlich sortiert erscheinen.

Mit -f wird die Groß- und Kleinschreibung beim Vergleich ignoriert:

sort -f namen.txt

Für reproduzierbare technische Abläufe wird häufig die C-Locale verwendet:

LC_ALL=C sort daten.txt

LC_ALL=C führt zu einer definierten, byteorientierten Zeichenreihenfolge. Das ist für Skripte und Vergleichsdateien nützlich, wenn unabhängig von der Spracheinstellung immer dasselbe Ergebnis entstehen soll. Für eine benutzerfreundliche deutsche Sortierung solltest du dagegen bewusst die gewünschte Locale wählen. Sprachspezifika wie die Position von Ä, Ö und Ü können je nach Locale anders behandelt werden.

Beispiele für Sortierschlüssel

DatenformatTrennzeichenPrimärer SchlüsselSekundärer SchlüsselBenötigte Optionen
Leerraumgetrennte PersonendatenLeerraumFeld 2Feld 1-k 2,2 -k 1,1
Doppelpunktgetrennte Kontodaten:Feld 3 numerischFeld 1-t ':' -k 3,3n -k 1,1
Semikolongetrennte Messwerte;Feld 2 numerischFeld 1-t ';' -k 2,2n -k 1,1

Typische Fehler beheben

Zahlen erscheinen als 1, 10, 2

Die Werte werden als Text verglichen. Verwende für den betreffenden Schlüssel -n, beispielsweise sort -k 1,1n zahlen.txt.

Die falsche Spalte wird verwendet

Prüfe den Feldtrenner und die Feldnummerierung ab 1. Bei festen Trennzeichen setze -t ausdrücklich. Bei Leerraum kann die tatsächliche Anzahl und Anordnung der Felder durch mehrere Leerzeichen oder Tabulatoren anders sein als erwartet.

Die Datei wird beim Sortieren in sich selbst leer

Die Ursache ist die Shell-Umleitung mit >. Schreibe in eine neue Datei oder verwende sort -o daten.txt daten.txt.

Umlaute oder Großbuchstaben stehen unerwartet

Prüfe die Locale und die Schreibweise. Für reproduzierbare technische Sortierung hilft LC_ALL=C; für einen Vergleich ohne Groß-/Kleinschreibung hilft -f.

Doppelte Zeilen bleiben scheinbar bestehen

Die gesamten Zeilen können verschieden sein, obwohl ein ausgewähltes Feld gleich ist. Entscheide, ob vollständige Zeilen oder nur Sortierschlüssel eindeutig sein sollen, und überprüfe die verwendete -k-Definition.

Versionsnummern sind falsch geordnet

Die Standardsortierung behandelt Punkte und Ziffern als normalen Text. Verwende sort -V versionen.txt.

sort -c meldet einen Fehler

Unsichtbare Leerzeichen, ein anderer Schlüssel, Großschreibung oder eine abweichende Locale können die Ursache sein. Untersuche die Datei, verwende beim Prüfen dieselben Optionen wie beim Sortieren und gleiche die Locale-Einstellungen ab.

Merksätze für die Praxis

  • sort datei sortiert Zeilen textuell aufsteigend und verändert die Quelle nicht.
  • -r kehrt die Reihenfolge um, -k wählt Felder und -t legt einen eigenen Trenner fest.
  • Für Zahlen, Größen und Versionen sind -n, -h beziehungsweise -V die passenden Vergleichsarten.
  • -c diagnostiziert eine falsche Reihenfolge, -C prüft still über den Exit-Status.
  • -u entfernt gleiche Vergleichsergebnisse; -s bewahrt bei gleichen Schlüsseln die Eingabereihenfolge.
  • Für Skripte kann LC_ALL=C eine reproduzierbare Zeichenreihenfolge sicherstellen.

Weitere Beispiele zu diesem Thema findest du unter sort mit Linux verwenden.