จะเรียงลำดับตัวเลขตามคอลัมน์สุดท้ายได้อย่างไร


23

ฉันมีข้อมูลนี้:

sdkxyosl 1
safkls 2
asdf--asdfasxy_asd 5
dkd8k  jasd 29
sdi44sw 43
asasd afsdfs 10
rklyasd 4

ฉันต้องการผลลัพธ์นี้:

sdi44sw 43
dkd8k  jasd 29
asasd afsdfs 10
asdf--asdfasxy_asd 5
rklyasd 4
safkls 2
sdkxyosl 1

ดังนั้นฉันต้องเรียงลำดับบรรทัดตามคอลัมน์สุดท้าย

ฉันไม่รู้ว่ามีกี่คอลัมน์ในหนึ่งบรรทัด

ฉันคิดไม่ออกว่าจะทำยังไง ฉันไม่มี "พลัง Perl" ฉันมีพลังในการเขียนสคริปต์โดยเฉลี่ยด้วย sed, awk, cut เป็นต้น

มีใครบางคนรู้วิธีที่จะทำ?

คำตอบ:


34

บรรทัดคำสั่งต่อไปนี้ใช้awkเพื่อผนวกฟิลด์สุดท้ายของแต่ละบรรทัดของ file.txt ทำการเรียงลำดับตัวเลขย้อนกลับจากนั้นใช้cutเพื่อลบฟิลด์ที่เพิ่ม:

awk '{print $NF,$0}' file.txt | sort -nr | cut -f2- -d' '

พระเจ้า ... ฉันไม่ทราบเกี่ยวกับ $ RS !! ขอบคุณมาก!!!!!
LanceBaynes

@forcefsck: sort -kผมไม่คิดว่ามันเป็นไปได้ที่มีเพียง begfieldฟังก์ชั่นในการจัดเรียง GNU เพียงนับลงไปที่ศูนย์ วิธีการตกแต่งเรียงลำดับไม่ได้ (DSU) ของคุณน่าจะเป็นวิธีที่ดีที่สุดที่ฉันคิด
มิเคล

ไม่สนใจว่าทำไม$NF,$RSและไม่ใช่$NF,$0? ฉันไม่รู้ว่า$RSทำอย่างนั้น (ผมคิดว่ามันเทียบเท่ากับการ$NF,$"\n"ที่ไม่เหมือนกัน แต่ที่ยังน่าแปลกใจที่ผมคิดว่า.)
มิเกล

2
@ johnny8888, @forcefsck: ใน awk $สามารถตามด้วยนิพจน์ใดก็ได้ “ ผลของนิพจน์หมายเลขฟิลด์ที่ประเมินผลเป็นอย่างอื่นที่ไม่ใช่จำนวนเต็มไม่เป็นลบจะไม่มีการระบุ ” GNU awk (ในระบบของฉัน) ใช้สตริงเหมือน"\n"ศูนย์ อื่น ๆ (เช่นการใช้งานดั้งเดิมโดย A, W และ K) ยกเลิกพร้อมกับข้อความแสดงข้อผิดพลาด หากRSเกิดขึ้นเป็นตัวเลขคุณจะได้รับฟิลด์ที่เกี่ยวข้องกับการใช้งานใด ๆ $0จึงไม่ทำเช่นนี้การใช้งาน
Gilles 'หยุดความชั่วร้าย'

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