Felder inline sortieren

9

Ich versuche, innerhalb einer Eingabezeile über eine unbekannte Anzahl von Feldern zu sortieren:

Eingang:

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

Ausgabe:

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

Ich habe so etwas verwendet, awk '{if($2 < $1) print $2,$1;else print}'aber es scheint, als würde es über mehr als zwei Felder hinweg chaotisch werden. Irgendeine Hilfe?

Chris
quelle

Antworten:

8

Ein Weg mit perl:

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

Ausgabe:

ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh
Birei
quelle
2
Da Sie verwenden -l, müssen Sie keine neue Zeile drucken. print join " ", sort @Fwird genügen.
Glenn Jackman
6

Ein Weg mit GNU awk:

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

Ausgabe:

ab bc 
ab bc 
bc cd ef 
bc cd ef 
ab bc cd 
ab bc cd ef gh
Birei
quelle
2

Hier ist eine andere perlLösung, ähnlich der Antwort von @ Birei, aber prägnanter:

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

Im Shell-Skript:

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

(Das gabelt zu viel, bevorzugt die Perl- oder Gnu-Awk-Lösung)

Emmanuel
quelle