msort(1)
foi projetado para classificar arquivos com registros de várias linhas. Ele tem um gui opcional, bem como uma versão de linha de comando normal e utilizável para humanos. (Pelo menos, humanos que gostam de ler atentamente os manuais e procurar exemplos ...)
AFAICT, você não pode usar um padrão arbitrário para registros, portanto, a menos que seus registros tenham tamanho fixo (em bytes, não em caracteres ou linhas). msort
tem uma opção -b
para registros que são blocos de linhas separadas por linhas em branco.
Você pode transformar sua entrada em um formato que funcionará com -b
facilmente, colocando uma linha em branco antes de cada ###...
(exceto a primeira).
Por padrão, ele imprime estatísticas no stderr, então, pelo menos, é fácil dizer quando ele não ordenou, porque achava que a entrada inteira era um único registro.
msort
funciona em seus dados. O comando sed
preenche uma nova linha para cada linha #+
, exceto para a linha 1. -w
classifica o registro inteiro (lexicograficamente). Há opções para escolher qual parte de um registro usar como chave, mas eu não precisava delas.
Também deixei de tirar as novas linhas extras.
$ 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
Não tive sorte com -r '#'
para usar isso como separador de registro. Achava que o arquivo inteiro era um registro.