awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file
La définition du séparateur d'enregistrement RS
sur une chaîne vide fait avancer awk dans les paragraphes à la fois. Pour chaque paragraphe, canalisez le paragraphe (in $0
) vers cmd (qui est défini sur sort
) et imprimez la sortie. Imprimez une ligne vierge pour séparer les paragraphes de sortie par un print ""
.
Si nous donnons des exemples de Perl, je présente une approche alternative à celle de Stéphane:
perl -e 'undef $/; print join "\n", sort (split /\n/), "\n"
foreach(split(/\n\n/, <>))' < file
Désactiver le séparateur de champ ( undef $/
), cela nous permet d'utiliser <>
et d'obtenir l'ensemble de STDIN. Nous avons ensuite split
cela autour \n\n
(paragraphes). foreach
"paragraphe", sort
les lignes en split
tintant autour des sauts de ligne, sort
puis join
les réintégrant ensemble et clouant sur une queue \n
.
Cependant, cela a un effet secondaire d'ajouter un séparateur "paragraphe de fin" sur le dernier paragraphe (s'il n'en avait pas auparavant). Vous pouvez contourner cela avec le moins moins joli:
perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
foreach(@list = split(/\n\n/, <>))' < file
Ceci affecte les paragraphes à @list
, puis il y a une "opération ternaire" pour vérifier s'il s'agit du dernier élément de foreach
(la \$_ == \$list[-1]
vérification). affiche ""
s'il s'agit de ( ? ...
), sinon ( : ...
) affiche "\n"
pour tous les autres "paragraphes" (éléments de @list
).
awk
solution qui évite lessort
frais généraux! Sournois!