Ordina i campi in linea


10

Sto cercando di ordinare all'interno di una riga di input su un numero sconosciuto di campi:

Ingresso:

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

Produzione:

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

Ho usato qualcosa del genere, awk '{if($2 < $1) print $2,$1;else print}'ma sembra che sarebbe diventato disordinato su più di due campi. Qualsiasi aiuto?

Risposte:


8

Un modo usando perl:

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

Produzione:

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

2
dal momento che stai usando -l, non è necessario stampare una nuova riga. print join " ", sort @Fsarà sufficiente.
Glenn Jackman,

6

Un modo usando GNU awk:

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

Produzione:

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

2

Ecco un'altra perlsoluzione, simile alla risposta di @ Birei ma più 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

1

Nella shell script:

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

(Che forchette troppo, preferisce la soluzione perl o gnu awk)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.