Ordenar campos inline

8

Estou tentando classificar dentro de uma linha de entrada em um número desconhecido de campos:

Entrada:

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

Saída:

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

Eu tenho usado algo como awk '{if($2 < $1) print $2,$1;else print}' , mas parece que seria confuso em mais de dois campos. Alguma ajuda?

    
por Chris 27.04.2012 / 18:00

4 respostas

8

Uma maneira de usar perl :

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

Saída:

ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh
    
por 27.04.2012 / 18:06
6

Uma maneira de usar o GNU awk:

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

Saída:

ab bc 
ab bc 
bc cd ef 
bc cd ef 
ab bc cd 
ab bc cd ef gh
    
por 27.04.2012 / 18:12
1

No script de shell:

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

(Que se bifurca demais, prefere a solução awl ou gnu awk)

    
por 02.07.2014 / 17:02
1

Aqui está outra solução perl , semelhante à resposta do @Birei mas mais 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
    
por 02.07.2014 / 17:48