msort(1)
è stato progettato per essere in grado di ordinare i file con record multilinea. Ha una GUI opzionale, così come una versione normale e utilizzabile dalla linea di comando per gli umani. (Almeno, agli umani a cui piace leggere attentamente i manuali e cercare esempi ...)
AFAICT, non è possibile utilizzare un modello arbitrario per i record, quindi a meno che i record non abbiano dimensioni fisse (in byte, non caratteri o righe). msort
ha -b
un'opzione per i record che sono blocchi di linee separate da righe vuote.
Puoi trasformare il tuo input in un formato che funzionerà -b
abbastanza facilmente, mettendo una riga vuota prima di ogni ###...
(tranne il primo).
Per impostazione predefinita, stampa le statistiche su stderr, quindi almeno è facile dire quando non è stato ordinato perché pensava che l'intero input fosse un singolo record.
msort
funziona sui tuoi dati. Il sed
comando antepone una nuova riga a ogni #+
riga tranne la riga 1. -w
ordina l'intero record (lessicograficamente). Ci sono opzioni per scegliere quale parte di un record usare come chiave, ma non ne avevo bisogno.
Ho anche lasciato fuori lo stripping delle nuove linee extra.
$ 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
Non ho avuto fortuna -r '#'
a usarlo come separatore di dischi. Pensava che l'intero file fosse un record.