msort(1)
wurde entwickelt, um Dateien mit mehrzeiligen Datensätzen sortieren zu können. Es hat eine optionale GUI sowie eine normale und für Menschen nutzbare Befehlszeilenversion. (Zumindest Menschen, die Handbücher gerne sorgfältig lesen und nach Beispielen suchen...)
AFAICT, Sie können kein willkürliches Muster für Datensätze verwenden, es sei denn, Ihre Datensätze haben eine feste Größe (in Bytes, nicht in Zeichen oder Zeilen). msort
hat einen -b
Option für Datensätze, die Zeilenblöcke sind, die durch Leerzeilen getrennt sind.
Sie können Ihre Eingabe in ein Format umwandeln, das mit -b
funktioniert ganz einfach, indem Sie vor jede ###...
eine Leerzeile setzen (außer dem ersten).
Standardmäßig gibt es Statistiken auf stderr aus, also ist es zumindest leicht zu erkennen, wenn es nicht sortiert hat, weil es dachte, die gesamte Eingabe sei ein einziger Datensatz.
msort
arbeitet mit Ihren Daten. Die sed
Befehl stellt jedem #+
einen Zeilenumbruch voran Zeile außer Zeile 1. -w
sortiert den gesamten Datensatz (lexikografisch). Es gibt Optionen, um auszuwählen, welcher Teil eines Datensatzes als Schlüssel verwendet werden soll, aber ich habe sie nicht benötigt.
Ich habe auch darauf verzichtet, die zusätzlichen Zeilenumbrüche zu entfernen.
$ 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 mit -r '#'
um das als Datensatztrennzeichen zu verwenden. Es dachte, die ganze Datei wäre ein Datensatz.
Eine Lösung besteht darin, zuerst die Zeilenvorschübe innerhalb eines Blocks in ein unbenutztes Zeichen Ihrer Wahl ('|' im Beispiel unten) zu ändern, das Ergebnis zu sortieren und das gewählte Trennzeichen wieder auf den ursprünglichen Zeilenvorschub zu ändern:
sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'
perl -0ne 'print sort /(#+[^#]*)/g' file.txt
perl -0
schlürft die gesamte Datei/(....)/g
Abgleichen und Extrahieren der Datensätzeprint sort ...
sortieren und ausdrucken