msort(1)
a été conçu pour pouvoir trier des fichiers avec des enregistrements sur plusieurs lignes. Il a une interface graphique en option, ainsi qu'une version de ligne de commande normale et utilisable pour les humains. (Au moins, les humains qui aiment lire attentivement les manuels et chercher des exemples ...)
AFAICT, vous ne pouvez pas utiliser un modèle arbitraire pour les enregistrements, donc à moins que vos enregistrements soient de taille fixe (en octets, pas en caractères ou en lignes). msort
a une -b
option pour les enregistrements qui sont des blocs de lignes séparés par des lignes vides.
Vous pouvez transformer votre entrée en un format qui fonctionnera -b
assez facilement, en mettant une ligne vierge avant chaque ###...
(sauf la première).
Par défaut, il imprime des statistiques sur stderr, donc au moins il est facile de savoir quand il n'a pas été trié car il pensait que l'entrée entière était un seul enregistrement.
msort
travaille sur vos données. La sed
commande ajoute une nouvelle ligne à chaque #+
ligne à l'exception de la ligne 1. -w
trie l'enregistrement entier (lexicographiquement). Il existe des options pour choisir la partie d'un enregistrement à utiliser comme clé, mais je n'en avais pas besoin.
J'ai également laissé de côté les nouvelles lignes supplémentaires.
$ 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
Je n'ai pas eu de chance -r '#'
de l'utiliser comme séparateur d'enregistrements. Il pensait que le dossier entier était un enregistrement.