Sortieren einer Tabelle mit einem Datensatztrennzeichen ohne Zeilenumbruch in Bash

Sortieren einer Tabelle mit einem Datensatztrennzeichen ohne Zeilenumbruch in Bash

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, newlinekö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 sortBefehl kann auch einen nicht standardmäßigen Feldtrenner mit der -tOption 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- newlineDatensatztrennzeichen 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 sortBefehl 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, sortund pasteSie 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'|' -

verwandte Informationen