msort(1)został zaprojektowany, aby móc sortować pliki z rekordami wieloliniowymi. Ma opcjonalne GUI, a także normalną i użyteczną dla ludzi wersję wiersza poleceń. (Przynajmniej ludzie, którzy lubią uważnie czytać podręczniki i szukają przykładów ...)
AFAICT, nie możesz użyć dowolnego wzorca dla rekordów, więc chyba że twoje rekordy mają stały rozmiar (w bajtach, a nie znakach lub wierszach). msortma -bopcję dla rekordów, które są blokami linii oddzielonymi pustymi liniami.
Możesz przekształcić swoje dane wejściowe w format, który będzie działał -bdość łatwo, umieszczając pusty wiersz przed każdym ###...(oprócz pierwszego).
Domyślnie drukuje statystyki na stderr, więc przynajmniej łatwo jest stwierdzić, kiedy nie posortował, ponieważ uważał, że całe wejście było pojedynczym rekordem.
msortdziała na twoich danych. sedPolecenie poprzedza nowego wiersza do każdej #+linii z wyjątkiem linii 1. -wsortuje cały rekord (leksykograficznie). Istnieją opcje wybierania, której części rekordu użyć jako klucza, ale nie potrzebowałem ich.
Pominąłem również usuwanie nowych linii.
$ 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
Nie miałem szczęścia -r '#'użyć tego jako separatora rekordów. Myślał, że cały plik to jedna płyta.