msort(1)
був розроблений так, щоб можна було сортувати файли з багаторядковими записами. Він має необов’язковий gui, а також нормальну та корисну для людей версію командного рядка. (Принаймні, люди, які люблять уважно читати посібники та шукати приклади ...)
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 '#'
використовувати це як роздільник записів. Здавалося, весь файл - один запис.