msort(1)был разработан, чтобы иметь возможность сортировать файлы с многострочными записями. Он имеет дополнительный графический интерфейс, а также нормальную и удобную для использования версию командной строки. (По крайней мере, люди, которые любят внимательно читать руководства и искать примеры ...)
AFAICT, вы не можете использовать произвольный шаблон для записей, поэтому, если ваши записи имеют фиксированный размер (в байтах, а не символах или строках). msortдействительно есть -bопция для записей, которые являются блоками строк, разделенных пустыми строками.
Вы можете преобразовать свой ввод в формат, который будет работать -bдовольно легко, поставив пустую строку перед каждым ###...(кроме первого).
По умолчанию он печатает статистику на stderr, поэтому, по крайней мере, легко определить, когда он не сортировался, потому что он думал, что весь ввод был одной записью.
msortработает на ваших данных. Команда sedдобавляет новую #+строку к каждой строке, кроме строки 1., -wсортирует всю запись (лексикографически). Есть варианты выбора того, какую часть записи использовать в качестве ключа, но они мне не нужны.
Я также не учел лишние лишние строки.
$ 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
Мне не повезло -r '#'использовать это как разделитель записей. Он думал, что весь файл был одной записью.