msort(1)
byl navržen tak, aby bylo možné třídit soubory s víceřádkovými záznamy. Má volitelné uživatelské rozhraní a také normální a pro lidi použitelnou verzi příkazového řádku. (Přinejmenším lidé, kteří rádi pozorně čtou manuály a hledají příklady...)
AFAICT, pro záznamy nemůžete použít libovolný vzor, pokud tedy vaše záznamy nemají pevnou velikost (v bajtech, nikoli ve znacích nebo řádcích). msort
má -b
volba pro záznamy, které jsou bloky řádků oddělených prázdnými řádky.
Svůj vstup můžete převést do formátu, který bude fungovat s -b
docela snadno tím, že před každou ###...
vložíte prázdný řádek (kromě prvního).
Ve výchozím nastavení tiskne statistiky na stderr, takže je alespoň snadné zjistit, kdy netřídil, protože si myslel, že celý vstup je jeden záznam.
msort
pracuje na vašich datech. sed
příkaz přidá nový řádek před každou #+
řádek kromě řádku 1. -w
seřadí celý záznam (lexikograficky). Existují možnosti pro výběr části záznamu, která se má použít jako klíč, ale nepotřeboval jsem je.
Také jsem vynechal odstraňování dalších nových řádků.
$ 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
S -r '#'
jsem neměl štěstí použít to jako oddělovač záznamů. Myslel si, že celý soubor je jeden záznam.
Řešením je nejprve změnit odřádkování uvnitř bloku na nepoužitý znak podle vašeho výběru ('|' v příkladu níže), seřadit výsledek a změnit zpět vybraný oddělovač na původní odřádkování:
sed -e 'N; N; N; N; N; s/\n/|/g' file.txt \
| sort -k2,2 -t\| \
| sed 's/|/\n/g'
perl -0ne 'print sort /(#+[^#]*)/g' file.txt
perl -0
usrkne celý soubor/(....)/g
spárovat a extrahovat záznamyprint sort ...
seřadit a vytisknout