Сортировать поля в строке

10

Я пытаюсь отсортировать в строке ввода по неизвестному количеству полей:

Входные данные:

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

Вывод:

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

Я использовал что-то вроде, awk '{if($2 < $1) print $2,$1;else print}'но кажется, что это будет грязно из-за более чем двух полей. Любая помощь?

Крис
источник

Ответы:

8

Один из способов использования perl:

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

Вывод:

ab bc
ab bc
bc cd ef
bc cd ef
ab bc cd
ab bc cd ef gh
Birei
источник
2
так как вы используете -l, вам не нужно печатать новую строку. print join " ", sort @Fбудет достаточно.
Гленн Джекман
6

Один из способов использования GNU awk:

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

Вывод:

ab bc 
ab bc 
bc cd ef 
bc cd ef 
ab bc cd 
ab bc cd ef gh
Birei
источник
2

Вот еще одно perlрешение, похожее на ответ @ Birei, но более сжатое:

$ 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
источник
1

В сценарии оболочки:

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

(Это слишком много, предпочтительнее решение perl или gnu awk)

Эммануэль
источник