เรียงลำดับข้อมูลจากมากไปหาน้อยของคอลัมน์แรกสำหรับค่าเท่ากันให้ใช้คอลัมน์ที่สองในลำดับจากน้อยไปหามาก


22

อนุญาตให้ฉันชี้แจง:

สมมติว่าฉันมีคำหลักบางคำที่มีความถี่ในการใช้งาน:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

สิ่งที่ฉันต้องการคือการจัดเรียงข้อมูลตามความถี่ในการเรียงลำดับจากมากไปน้อยและหากมีค่าเท่ากันควรใช้คอลัมน์ที่สองตามลำดับจากน้อยไปหามาก

sort -n -r foo.txt

ทำส่วนแรก แต่คอลัมน์ที่สองก็เป็นเช่นreversedกัน:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

ฉันจะบรรลุผลลัพธ์ต่อไปนี้ได้อย่างไร

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

ฉันคิดว่าฉันต้องใช้การ-kโต้แย้ง แต่ฉันไม่สามารถหาวิธี!

ฉันต้องการที่จะรู้ว่าวิธีนี้สามารถทำได้โดยใช้เพียงคำสั่งของsort bashอย่างไรก็ตามหากไม่สามารถทำสิ่งนี้ได้โดยเฉพาะsortคำสั่งอื่น ๆ จะสามารถใช้งานร่วมกับ Bourne shell ได้


[ค่อนข้างโอที]: แม้ว่าจะเทียบเท่ากับข้อมูลเฉพาะอย่างนี้ แต่การใช้-gตัวเลือกGNU-sort (ตัวเลขทั่วไป) แทน-nการเปรียบเทียบเชิงตัวเลขนั้นปลอดภัยกว่า: ทำงานได้อย่างถูกต้องสำหรับทั้งทศนิยมและจำนวนเต็ม
arielf

คำตอบ:


32

ระบุคีย์การเรียงลำดับแยกกันตามเกณฑ์:

sort -k1,1nr -k2,2 inputfile

ระบุว่ากุญแจดอกแรกจะเรียงตัวเลขในการสั่งซื้อกลับในขณะที่สองจะถูกจัดเรียงตามค่าเริ่มต้นลำดับการจัดเรียง

การอ้างอิงจากการเรียงลำดับ POSIX :

-k keydef

keydefอาร์กิวเมนต์เป็นนิยาม จำกัด เขตข้อมูลคีย์การเรียงลำดับ รูปแบบของคำนิยามนี้คือ:

field_start [ type ] [ , field_end [ type ]]

โดยที่field_startและfield_endกำหนดเขตข้อมูลคีย์ที่ จำกัด เฉพาะส่วนของบรรทัด (ดูที่ส่วนคำอธิบายขยาย) และประเภทเป็นตัวดัดแปลงจากรายการอักขระ 'b', 'd', 'f', 'i', ' n ',' r ' ตัวปรับ 'b' จะทำตัวเหมือน-bตัวเลือก แต่จะใช้เฉพาะกับfield_startหรือfield_endที่แนบมาเท่านั้น ตัวดัดแปลงอื่น ๆ จะทำงานเหมือนตัวเลือกที่เกี่ยวข้อง แต่จะใช้เฉพาะกับเขตข้อมูลหลักที่แนบมาเท่านั้น พวกเขาจะมีผลกระทบนี้หากระบุไว้กับfield_start , field_endหรือทั้งสองอย่างตัวเลือกจะไม่มีผลกับทั้ง การใช้งานจะต้องสนับสนุนอย่างน้อยเก้าเหตุการณ์ของ-kตัวเลือกซึ่งจะมีความสำคัญในการสั่งซื้อบรรทัดคำสั่ง หากไม่มีการ-kระบุตัวเลือกจะใช้คีย์การเรียงลำดับเริ่มต้นของทั้งบรรทัด

เมื่อมีหลายฟิลด์คีย์คีย์ที่ใหม่กว่าจะถูกเปรียบเทียบหลังจากคีย์ก่อนหน้าทั้งหมดเปรียบเทียบเท่ากันเท่านั้น ยกเว้นเมื่อ-uตัวเลือกที่มีการระบุสายที่อื่นเปรียบเทียบเท่ากับจะต้องสั่งถ้าไม่มีตัวเลือก-d, -f, -i, -nหรือ-kอยู่ในปัจจุบัน ( แต่-r ยังคงอยู่ในผลถ้ามันถูกระบุ) และไบต์ทั้งหมดในเส้นที่สำคัญในการ การเปรียบเทียบ ลำดับที่บรรทัดที่ยังคงเปรียบเทียบเท่ากันนั้นไม่ได้ระบุเป็นลายลักษณ์อักษร

สิ่งนี้จะผลิต:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

ขอบคุณ ทำเคล็ดลับ ต้องรอ 10 นาทีเพื่อยอมรับ!
Pouya

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