Ich habe einen Tisch, der aussieht wie
'a;b;f|d;e;c|g;h'
die ich nach der dritten Spalte sortieren möchte. Die Ausgabe sollte sein
'g;h|d;e;c|a;b;f'
Wenn ich die Standardtrennzeichen verwenden würde whitespace
, newline
könnte dies mit dem Standard erreicht werden sort
:
printf '%b' 'a b f\nd e c\ng h' | sort -k 3
würde ausgeben
g h
d e c
a b f
Der sort
Befehl kann auch einen nicht standardmäßigen Feldtrenner mit der -t
Option annehmen:
printf '%b' "a;b;f\nd;e;c\ng;h" | sort -k 3 -t ';'
würde ausgeben
g;h
d;e;c
a;b;f
Ich habe jedoch keine Möglichkeit gefunden, eine Tabelle mit einem Nicht- newline
Datensatztrennzeichen zu sortieren.
Kann dies erreicht werden? Und wenn ja, wie?
Bearbeiten
Eine wesentliche Voraussetzung ist, dass dabei weder Daten noch Trennzeichen verändert werden, sondern lediglich deren Reihenfolge.
Andere Tools als der sort
Befehl sind auch ok. Vorzugsweise POSIX-kompatibel, aber nicht unbedingt.
Antwort1
Der Sortierbefehl kann nur Eingabedatensätze sortieren, die durch Zeilenumbruch- oder NUL-Zeichen getrennt sind, wie im Handbuch angegeben
Das Sortierprogramm sortiert Text- und Binärdateien zeilenweise. Eine Zeile ist ein Datensatz, der vom nachfolgenden Datensatz durch ein Zeilenumbruchzeichen (Standard) oder ein NUL-Zeichen '\0' getrennt ist.
Ihre Transformation müsste also irgendwann das Datensatztrennzeichen kennen (in Ihrem Fall |
), um zum gewünschten Ergebnis zu gelangen. Alle anderen Befehle (Awk/Perl oder Datamash) müssten diese Annahme treffen
Nicht mit einem einzelnen eigenständigen Tool, sondern mit tr
, sort
und paste
Sie könnten es tun. Sie könnten sehen, wie die Transformation Gestalt annimmt, indem Sie der Pipeline jeweils einen Befehl hinzufügen
echo 'a;b;f|d;e;c|g;h' | tr '|' '\n' | sort -t';' -k3,3 | paste -sd'|' -