Ordenar campos en línea

10

Estoy tratando de ordenar dentro de una línea de entrada sobre un número desconocido de campos:

Entrada:

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

Salida:

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

He estado usando algo como, awk '{if($2 < $1) print $2,$1;else print}'pero parece que se volvería complicado en más de dos campos. ¿Alguna ayuda?

Chris
fuente

Respuestas:

8

Una forma de usar perl:

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

Salida:

ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh
Birei
fuente
2
Como está utilizando -l, no necesita imprimir una nueva línea. print join " ", sort @FSerá suficiente.
Glenn Jackman
6

Una forma de usar GNU awk:

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

Salida:

ab bc 
ab bc 
bc cd ef 
bc cd ef 
ab bc cd 
ab bc cd ef gh
Birei
fuente
2

Aquí hay otra perlsolución, similar a la respuesta de @ Birei pero más concisa:

$ 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
fuente
1

En script de shell:

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

(Eso se bifurca demasiado, prefiere la solución perl o gnu awk)

Emmanuel
fuente