Sắp xếp các trường nội tuyến


10

Tôi đang cố gắng sắp xếp trong một dòng đầu vào trên một số trường không xác định:

Đầu vào:

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

Đầu ra:

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

Tôi đã sử dụng một cái gì đó giống như awk '{if($2 < $1) print $2,$1;else print}'nhưng có vẻ như nó sẽ trở nên lộn xộn hơn hai lĩnh vực. Có ai giúp đỡ không?

Câu trả lời:


8

Một cách sử dụng perl:

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

Đầu ra:

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

2
vì bạn đang sử dụng -l, bạn không cần phải in một dòng mới. print join " ", sort @Fsẽ đủ.
glenn jackman

6

Một cách sử dụng GNU awk:

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

Đầu ra:

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

2

Đây là một perlgiải pháp khác , tương tự như câu trả lời của @ Birei nhưng ngắn gọn hơn:

$ 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

Trong tập lệnh shell:

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

(Điều đó tạo ra quá nhiều, trước đó là giải pháp perl hoặc gnu awk)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.