เรียงลำดับฟิลด์แบบอินไลน์


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 ล่วงหน้า)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.