Сортувати поля в рядку


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

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

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

1

У сценарії оболонки:

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

(Це вилки занадто багато, краще віддайте перевагу рішення perl або gnu awk)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.