フィールドをインラインで並べ替え


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}'、3つ以上のフィールドで乱雑になるようです。何か助けは?

回答:


8

使用する1つの方法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十分であろう。
グレン・ジャックマン2012

6

GNU awkを使用する1つの方法:

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ソリューションをお勧めします)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.