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 '#'
использовать это как разделитель записей. Он думал, что весь файл был одной записью.