พฤติกรรมที่ไม่ถูกต้องของคำสั่งการเรียงลำดับ?


14

ฉันพยายามเรียงลำดับเนื้อหาของไฟล์ในเดสก์ท็อป Ubuntu 14.04 (Trusty Tahr) ในกรณีของฉันผลลัพธ์ที่คาดหวังควรเหมือนกับเนื้อหาต้นฉบับ แต่ผลลัพธ์ที่แท้จริงไม่ได้ ทำไม?

# cat test.txt
a++-a
a++-b
a++-c
ab
ac
# cat test.txt | sort
a++-a
ab
a++-b
ac
a++-c

4
ผมมือคุณถ้วยรางวัลรางวัลเล็ก ๆ สำหรับการใช้งานที่ไร้ประโยชน์ cat
David Foerster

3
ความคิดเห็นของ @DavidFoerster เป็นวิธีที่ตลกในการชี้ให้เห็นว่าคุณสามารถแทนที่ได้cat test.txt | sortด้วยsort test.txt:)
Volker Siegel

@VolkerSiegel: จริง แต่มีสูตรที่มีประโยชน์ที่ใช้catในการเริ่มต้น ตัวอย่างเช่นcat FILE | grep dev | sortจะแสดงเฉพาะบรรทัดที่มี "dev" อยู่ในรายการ (เรียงตามลำดับ) การใช้sort FILE | grep devสร้างผลลัพธ์เดียวกัน แต่มีสี
AlainD

คำตอบ:


17

คุณสามารถใช้LC_ALLตัวแปรตั้งค่าLC_ALL=Cก่อนโทรsort

$ LC_ALL=C sort test.txt
a++-a
a++-b
a++-c
ab
ac

อ่านนี้LC_ALL=Cคำตอบถ้าคุณต้องการที่จะรู้ว่าสิ่งที่น่าอัศจรรย์นี้ นี่คือบทสรุปสั้น ๆ :

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

นอกจากนี้ตามที่ @ KenMollerup ชี้อ้างจาก man sort

   ***  WARNING  ***  The locale specified by the environment affects sort
   order.  Set LC_ALL=C to get the traditional sort order that uses native
   byte values.

ดังนั้นเมื่อใช้การเรียงลำดับLC_ALL=Cให้เรียงลำดับการเปรียบเทียบสัญลักษณ์ทีละน้อย มิฉะนั้นsortจะละเว้นอักขระที่ไม่ใช่ตัวอักษรและตัวเลขทั้งหมด


ขออภัยไม่เห็นสิ่งนี้ฉันตอบสนองต่อความคิดเห็น!
Ken Mollerup

@KenMollerup man sortขอบคุณสำหรับการชี้ไปที่ ฉันไม่ได้สังเกต
c0rp

8

การเรียงลำดับใช้การเรียงลำดับตัวอักษรและตัวเลขเช่นเดียวกับเราอักขระพิเศษเช่น + - <> ... ถูกละเว้นตัวเลขจะได้รับการปฏิบัติตัวเลขดังนั้น 1, 2, 3 .. มาก่อน 11, 12 1066 1104 - ดู!

ดังนั้นรายการของคุณถูกมองว่า: aa, ab, ab, ac, ac


มีตัวเลือกสำหรับการเรียงลำดับหรือไม่ซึ่งจะไม่สนใจอักขระพิเศษเช่น test.txt จะเรียงลำดับตามที่ต้องการหรือไม่
Doug Smythies

6
ดูสิ่งนี้ในการจัดเรียงของมนุษย์: *** คำเตือน *** สถานที่ที่ระบุโดยสภาพแวดล้อมมีผลต่อลำดับการจัดเรียง ตั้ง LC_ALL = C เพื่อรับลำดับการจัดเรียงดั้งเดิมที่ใช้ค่าไบต์ดั้งเดิม
Ken Mollerup

@KenMollerup โปรดเพิ่มข้อมูลเพิ่มเติมในคำตอบของคุณ เพิ่มคำพูดจากman sortเพิ่มตัวอย่าง
c0rp

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