Je pense que je suis assez expérimenté maintenant dans le tri par colonnes ; cependant, je n'ai jusqu'à présent rien trouvé pour trier les lignes continues .
Supposons que nous ayons un fichier texte qui ressemble à ceci: (très simplifié, bien sûr)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Maintenant, est-il possible de trier les lignes de manière alphanumérique pour chaque bloc séparément ? Je veux dire, pour que le résultat ressemble à ceci:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
D'après ce que j'ai trouvé dans la sort
page de manuel, cela pourrait ne pas être possible avec la sort
commande UNIX intégrée . Ou peut-on même le faire sans avoir recours à des outils externes / tiers?
la source
awk
solution qui évite lessort
frais généraux! Sournois!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 sursort
) et imprimez la sortie. Imprimez une ligne vierge pour séparer les paragraphes de sortie par unprint ""
.Si nous donnons des exemples de Perl, je présente une approche alternative à celle de Stéphane:
Désactiver le séparateur de champ (
undef $/
), cela nous permet d'utiliser<>
et d'obtenir l'ensemble de STDIN. Nous avons ensuitesplit
cela autour\n\n
(paragraphes).foreach
"paragraphe",sort
les lignes ensplit
tintant autour des sauts de ligne,sort
puisjoin
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:
Ceci affecte les paragraphes à
@list
, puis il y a une "opération ternaire" pour vérifier s'il s'agit du dernier élément deforeach
(la\$_ == \$list[-1]
vérification). affiche""
s'il s'agit de (? ...
), sinon (: ...
) affiche"\n"
pour tous les autres "paragraphes" (éléments de@list
).la source
/usr/bin/sort
avec cette ligne ou s'agit-il d'une commandeawk
intégrée de "tri"?J'ai écrit un outil en haskell qui vous permet d'utiliser sort, shuf, tac ou toute autre commande sur des paragraphes de texte.
https://gist.github.com/siers/01306a361c22f2de0122
EDIT: l'outil est également inclus dans ce dépôt: https://github.com/siers/haskell-import-sort
Il divise le texte en blocs, joint les sous-blocs avec
\0
char, dirige la commande et fait finalement la même chose en sens inverse.28-08-2015 : J'ai trouvé une autre utilisation personnelle de cet outil - sélectionner N paragraphes après une ligne.
la source
Si GNU awk est disponible, vous pouvez trier chaque bloc à l'aide de la
asort()
fonction intégrée. Quelque chose comme ça:blocksort.awk
Exécutez-le comme ceci:
la source
TXR Lisp étape par étape:
Références: get-lines , partition * , op , where , chain , length , zerop , mapcar , interpose .
la source
[mapcar sort ...]
nous pourrions remplacersort
par une fonction qui redirige les chaînes à travers un processus externe. On peut alors se retrouver avec un outil de distribution d'une commande externe de traitement de texte sur des paragraphes.