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). msort
ma -b
opcję 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ł -b
dość ł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.
msort
działa na twoich danych. sed
Polecenie poprzedza nowego wiersza do każdej #+
linii z wyjątkiem linii 1. -w
sortuje 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.