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?

Chris
la source

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
Birei
la source
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
Birei
la source
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
cuonglm
la source
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)

Emmanuel
la source