J'ai une list de lignes de l'index d'un livre, disons
day satur- sun- holy- night ball to- eve election christmas
Maintenant, je veux sortinger ces lignes de la manière la plus évidente: je veux regrouper tous les "parent" -input ( day
, night
, eve
) avec leurs inputs respectives "enfant" ( satur-
, satur-
, …) et les sortinger groupes par leur input parent. Je veux aussi sortinger les inputs enfant dans un groupe donné.
Ainsi, la sortie désirée est:
day holy- satur- sun- eve christmas election night ball to-
Comment pourrais-je y parvenir en utilisant des outils de base unix comme sort
?
Vous pouvez choisir un caractère peu probable dans votre file text, append le nom parent + ce caractère à chaque ligne enfant, sortinger puis supprimer le nom parent et le séparateur de chaque ligne enfant, par exemple avec gnu
sed et un caractère ascii bas comme \x02
sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'
Comment ça marche:
le 1er sed
fait ce qui suit:
/^[^[:blank:]]/h
– copy des lignes non indentées (parents) sur l'espace de cale
//!G
– sur les lignes indentées (enfants) append le contenu de l'espace de retenue à l'espace des motifs
s/\(.*\)\n\(.*\)/\2\x02\1/
– intervertir les lignes dans l'espace des motifs en remplaçant \n
ewline par \x02
après cela, sort
et supprimer tout ce qui inclut \x02
avec un second sed 's/.*\x02//'