Trier les champs en ligne


10

J'essaie de trier dans une ligne d'entrée sur un nombre inconnu de champs:

Contribution:

ab bc
bc ab
cd ef bc 
bc cd ef
cd bc ab
ef ab bc cd gh

Production:

ab bc
ab bc
bc cd ef
bc cd ef
ab cb cd
ab bc cd ef gh

J'ai utilisé quelque chose comme, awk '{if($2 < $1) print $2,$1;else print}'mais il semble que cela deviendrait compliqué sur plus de deux champs. De l'aide?

Réponses:


8

À sens unique en utilisant perl:

perl -lane 'printf qq[%s\n], join q[ ], sort @F' infile

Production:

ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh

2
puisque vous utilisez -l, vous n'avez pas besoin d'imprimer une nouvelle ligne. print join " ", sort @Fsuffira.
glenn jackman

6

Une façon d'utiliser GNU awk:

awk '{ 
    split($0, arr); 
    asort(arr); 
    for (i=1; i<=length(arr); i++) { 
        printf "%s ", arr[i] }; 
        printf RS 
    }
' infile

Production:

ab bc 
ab bc 
bc cd ef 
bc cd ef 
ab bc cd 
ab bc cd ef gh

2

Voici une autre perlsolution, similaire à la réponse de @ Birei mais plus concise:

$ perl -anle 'print "@{[sort @F]}"' file
ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh

1

Dans le script shell:

while read n    
do
   echo $(echo $n | tr " " "\n" | sort )
done < infile

(Cela fourche trop, préférez la solution awl perl ou gnu)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.