内联排序字段


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}'但似乎在两个以上的领域上都会变得混乱。有什么帮助吗?

Answers:


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就足够了。
glenn jackman 2012年

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

在shell脚本中:

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

(分叉太多,更喜欢perl或gnu awk解决方案)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.