ลำดับเริ่มต้นของการเรียงลำดับ Linux คืออะไร


18

เป็นเวลานานฉันคิดว่าพฤติกรรมเริ่มต้นของsortโปรแกรมกำลังใช้คำสั่ง ASCII อย่างไรก็ตามเมื่อฉันป้อนบรรทัดต่อไปนี้sortโดยไม่มีข้อโต้แย้งใด ๆ :

#
@

ฉันได้:

@
#

แต่ตามตาราง ASCII #คือ 35 และ@เป็น 64 อีกตัวอย่างคือ:

A
a

และผลลัพธ์คือ:

a
A

ใครสามารถอธิบายสิ่งนี้ได้บ้าง โดยวิธีการ 'สั่งพจนานุกรม' เมื่อใช้sort -dคืออะไร?


5
เรียงลำดับขึ้นอยู่กับการตั้งค่าสถานที่ของคุณ
janneb

2
แต่อย่างน้อยก็เรียงตามลำดับตัวอักษรตามลำดับใน GNU
jarno

คำตอบ:


17

ดูเหมือนว่าคุณกำลังใช้ภาษาที่ไม่ใช่ POSIX

ลอง:

export LC_ALL=C

sortแล้วก็

info sort ชัดเจนว่า:

(1) หากคุณใช้ภาษาที่ไม่ใช่ POSIX (เช่นโดยการตั้งค่า 'LC_ALL' เป็น 'en_US') จากนั้น `sort 'อาจสร้างผลลัพธ์ที่เรียงลำดับแตกต่างจากที่คุณคุ้นเคย ในกรณีนี้ให้ตั้งค่าตัวแปรสภาพแวดล้อม `LC_ALL 'เป็น` C' โปรดทราบว่าการตั้งค่า `LC_COLLATE 'เท่านั้นมีสองปัญหา อันดับแรกจะไม่ได้ผลหากตั้งค่า LC_ALL ด้วย ประการที่สองมันมีพฤติกรรมที่ไม่ได้กำหนดหาก `LC_CTYPE '(หรือ` LANG' หากไม่มีการตั้งค่า `LC_CTYPE ') ให้เป็นค่าที่เข้ากันไม่ได้ ตัวอย่างเช่นคุณจะได้รับพฤติกรรมที่ไม่ได้กำหนดถ้า `LC_CTYPE 'คือ` ja_JP.PCK' แต่ `LC_COLLATE 'คือ` en_US.UTF-8'


3
OP กำลังถามว่าเรียงลำดับคืออะไรไม่ใช่วิธีการเปลี่ยนแปลง

1
ขอบคุณฉันได้ทดสอบกับการตั้งค่าเครื่องและสถานที่ของฉันแล้วจะมีผลกับพฤติกรรมการเรียงลำดับ

3

หากต้องการกำหนดลำดับการจัดเรียงเพียงสร้างไฟล์ที่มีอักขระแตกต่างกันในแต่ละบรรทัดและเรียงลำดับ ผลลัพธ์ที่ได้จะบอกให้คุณเรียงลำดับ


ดีเรียบง่ายและมีประสิทธิภาพ

1
โดยทั่วไปแล้วเป็นความคิดที่ดีมาก แต่ก็ไม่เพียงพอเสมอไป ไม่จำเป็นต้องกำหนดการเรียงหน้าในแต่ละอักขระเท่านั้น บางคนคิดว่า "เอะ" ราวกับว่ามันเป็น collations เรียงความหรือรักษาหนังสติ๊กราวกับว่าพวกเขากำลังสลาย อีกกรณีหนึ่งคือการเปรียบเทียบหลายอย่างถือว่า 'a' และ 'A' เท่ากัน แต่ลำดับที่คุณเห็นโดยการทดสอบไม่ได้บอกคุณว่า (อาจบอกคุณได้ว่าการเรียงนั้นเสถียรหรือไม่) และการทดสอบอักขระเดี่ยวไม่ได้บอกว่าการขยายแท็บการทำให้เป็นมาตรฐานของช่องว่าง ฯลฯ มีผลหรือไม่ อย่างไรก็ตามมันเป็นจุดเริ่มต้นที่ดีมาก
TextGeek

1
(สายเกินไปที่จะแก้ไขความคิดเห็นก่อนหน้า) - ตราบใดที่คุณมีอักขระที่หลากหลายมากพอคุณสามารถบอกได้ว่าตัวพิมพ์เล็กและตัวใหญ่ไม่สามารถมองเห็น (ตัวอย่าง) aAbB แทนที่จะเป็น abAB
TextGeek

2

ดังที่man sortกล่าวว่า“ ลำดับของพจนานุกรม” หมายถึง“ พิจารณาเฉพาะช่องว่างและตัวอักษรและตัวเลข” ตัวอย่างเช่นได้รับข้อมูล

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

sortคำสั่งที่ไม่มีการตกแต่งจะสร้างขึ้น

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(วางสายที่ขึ้นต้นด้วยตัวอักษรพื้นที่และ!, #, $, %และ@สัญลักษณ์1 ข้างหน้าของเส้นที่ขึ้นต้นด้วยตัวอักษรและตัวเลข; เช่นตัวอักษรและตัวเลข ) แต่sort -dผลิต

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsยังคงเป็นอันดับแรกเนื่องจากเริ่มต้นด้วยช่องว่าง แต่อักขระพิเศษ (เครื่องหมายวรรคตอน) จะถูกละเว้น  17มาก่อน42และfoxมาระหว่างbrownและjumpsทั้งๆที่ความจริงที่ว่า42และมีตัวละครในด้านหน้าของพวกเขาที่ปกติจะย้ายพวกเขาก่อนfox ____________ 1ตามลำดับค่า ASCII ของพวกเขา: space = 040, = 041, = 043, = 044, = 045, และ= 0100 โปรดทราบว่า (ไม่สนใจแถบพื้นที่) นี่เป็นลำดับจากซ้ายไปขวาโดยประมาณสำหรับคีย์บอร์ดบางรุ่น17

!#$%@


1
ลำดับในตัวอย่างแรกของคุณโดยที่ข้อความจะถูกเรียงลำดับแรกในเครื่องหมายวรรคตอนอาจส่งผลให้เกิดถ้าโลแคลที่มีผลคือ C (เช่นเดียวกับ LC_ALL = C) แต่ไม่ใช่ในโลแคลอื่น ตำแหน่งที่ตั้งใดเป็นค่าเริ่มต้นขึ้นอยู่กับการตั้งค่าระบบปฏิบัติการ ดังนั้นเครื่องที่ไม่มีเครื่องตกแต่ง sortควรจะแตกต่างกันในหลายดิสทริบิวชั่น
Isaac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.