ใช้ GNU sort เพื่อเรียงลำดับโดยใช้คีย์เดียว / ป้องกันการเรียงลำดับของคีย์อื่นที่ไม่ต้องการ


9

ฉันมีไฟล์ที่มีข้อมูลที่สั่งไว้แล้วและฉันต้องการสั่งซื้อไฟล์อีกครั้งตามค่าในคีย์เดียวโดยไม่ทำลายลำดับของข้อมูลในคีย์อื่น

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

ไฟล์ data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

ผลลัพธ์ที่คาดหวัง:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

คำสั่ง:

sort -k 1,1 <data.txt

ผลลัพธ์: การเรียงลำดับที่ไม่ต้องการฉันไม่ได้ถาม:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

คำตอบ:


21

คุณจำเป็นต้องมีการจัดเรียงที่มีเสถียรภาพ จากman sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

ได้แก่ .:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

โปรดทราบว่าคุณอาจต้องการ-nหรือ--numeric-sortถ้าคีย์ของคุณเป็นตัวเลข (ตัวอย่างเช่นคุณอาจได้ผลลัพธ์ที่ไม่คาดคิดเมื่อเปรียบเทียบ 10 ถึง 2 กับค่าเริ่มต้น - คำศัพท์ - เรียงลำดับ) ในกรณีนี้เป็นเพียงเรื่องของการทำ:

sort -sn <data.txt

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



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

4

สำหรับการนำไปใช้ (ที่ไม่ใช่ GNU) sortที่ไม่มี-sตัวเลือกคุณสามารถทำสิ่งต่อไปนี้:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

นั่นคือเตรียมหมายเลขบรรทัดเพื่อให้เป็นคีย์การเรียงลำดับที่สองและตัดออกหลังจากนั้น

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