msort(1)
wurde entwickelt, um Dateien mit mehrzeiligen Datensätzen sortieren zu können. Es verfügt über eine optionale Benutzeroberfläche sowie eine normale und für Menschen verwendbare Befehlszeilenversion. (Zumindest Menschen, die Handbücher gerne sorgfältig lesen und nach Beispielen suchen ...)
AFAICT, Sie können kein beliebiges Muster für Datensätze verwenden, es sei denn, Ihre Datensätze haben eine feste Größe (in Byte, keine Zeichen oder Zeilen). msort
hat eine -b
Option für Datensätze, die durch Leerzeilen getrennte Zeilenblöcke sind.
Sie können Ihre Eingabe in ein Format umwandeln, das -b
problemlos funktioniert , indem Sie vor jede Zeile ###...
(mit Ausnahme der ersten) eine Leerzeile einfügen .
Standardmäßig werden Statistiken zu stderr ausgegeben. Zumindest ist es leicht zu erkennen, wann die Sortierung fehlgeschlagen ist, da die gesamte Eingabe für einen einzelnen Datensatz gehalten wurde.
msort
arbeitet an Ihren Daten. Mit dem sed
Befehl wird jeder #+
Zeile mit Ausnahme von Zeile 1 eine neue Zeile vorangestellt. -w
Der gesamte Datensatz wird (lexikografisch) sortiert. Es gibt Optionen zum Auswählen des Teils eines Datensatzes, der als Schlüssel verwendet werden soll, aber ich habe sie nicht benötigt.
Ich habe auch die zusätzlichen Zeilenumbrüche weggelassen.
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
Ich hatte kein Glück damit -r '#'
, das als Datensatztrennzeichen zu verwenden. Es dachte, die ganze Datei sei ein Datensatz.