เหตุใด 'การเรียงลำดับ' จึงไม่สนใจอักขระพิเศษเช่นเครื่องหมายดอกจัน


27

ฉันคิดว่าsortจะเรียงลำดับคำนำหน้าร่วมกัน แต่นั่นไม่ได้เกิดขึ้นเสมอไป ใช้อินพุตนี้เช่น:

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo

หลังจากนั้นsortฉันคาดว่าทุกอย่างAT*จะจบลงในก้อนเดียว แต่เมื่อคุณเรียกใช้ข้อมูลนี้ผ่านอินพุตsortเอาต์พุต ==ทำไมถึงเป็นอย่างนั้น? ฉันไม่ได้ระบุตัวเลือกใด ๆ เพื่อละเว้นอักขระที่ไม่ใช่ตัวอักษรหรืออะไรก็ตาม sort dict > outเพียงแค่

รุ่นของฉันมาจากsortcoreutils 8.5-1ubuntu3


ใช้งานได้สำหรับฉัน บางทีนามแฝงอยู่ที่ไหนสักแห่ง?
Matthieu Cartier

คำตอบ:


17
sort --version-sort filename 

สิ่งนี้รักษาลำดับของตัวเลขตามธรรมชาติ


4
+1 ใช้งานได้ แต่ทำไม มีเพียงตัวเลขเดียวในข้อความ
Aaron Digulla

2
ทำงานโดยไม่จำเป็นต้องเปลี่ยนสภาพแวดล้อม +1
เมเรดิ ธ ที่

@AaronDigulla: ฉันสงสัยว่ามันจะจัดการกับสตริงในการเรียงลำดับรุ่นเกือบจะเป็นวิธีที่โง่เง่าในการจัดเรียงสิ่งต่าง ๆ ดังนั้นมันจึงไม่สนใจสถานที่และจัดการกับตัวเลขด้วยวิธีพิเศษเท่านั้น
JohnEye

23

การตั้งค่า LC_ALL = C เรียกคืนการเรียงลำดับแบบดั้งเดิมในกรณีของฉัน แพ็คเกจ: coreutils เวอร์ชั่น: 8.5-1ubuntu3

export LC_ALL=C 

LANG=Cยังใช้งานได้ สิ่งที่ตัวฉัน: LANGตั้งเป็นen_US.UTF-8; ทำไมถึง*ได้รับการดูแลเป็นพิเศษ?
Aaron Digulla

2
LC_COLLATEคือการตั้งค่าที่เฉพาะเจาะจงsortฯลฯ
หยุดชั่วคราวจนกว่าจะมีประกาศ

ใช้งานได้สำหรับฉันใน Raspbian // Pixel ... การเรียงลำดับ 'ความน่ารำคาญ' โดยไม่สนใจตัวอักษรพิเศษคือ killig ฉัน ... ขอบคุณ
ZEE

2
ไม่จำเป็นต้องexportตั้งค่าท้องถิ่นและอาจยุ่งกับสิ่งอื่น LC_ALL=C sortเพียงแค่ตั้งค่าในการเรียกร้องให้เรียงลำดับตาม: เช่นecho -e 'a\n*\n*b\nc' | LC_ALL=C sortLC_ALL จะไม่เปลี่ยนแปลงนอกการโทรเพื่อจัดเรียง
Hashbrown

1

มันทำงานได้ตามที่คาดไว้สำหรับฉัน (บน cygwin)

sort input > output ผลลัพธ์ใน

AT AD *
AT * โฆษณา
AT * Eydie
AT * ฉัน
AT * อนามัย
AT * Ito
AT * OD
AT * ยูทาห์
AT * Uta
AT * ไวแอตต์
AT โฆษณา *
AT * ตา
AT รหัส *
AT ข้าวโอ๊ต *
AT * เกินดุล
AT หนี้ที่ค้างชำระ *
AT * ประทับใจ
AT0S * eightieths
AT0S * ของ eyetooth
ATF * รถ ATV
ATF * Ediva
ATF * ADV
ATF * เทศนา
ATFKT * สนับสนุน
ATFKT * outfought
ATFKTNK * การสนับสนุนการ
ATFKTS * สนับสนุน
ATHT * เฮด
ATHT * สิวหัวขาว
ATJ * สุภาษิต
ATNXNS * ความสนใจของ
ATNXNS * ของการลดทอน
ATNXNS * ของติดไฟ
เอทีพี * Adobe
ATP0K * ไม่ทราบสาเหตุ
ATT * wighted
ATT * เบื๊อก
ATT * ป่า
ATX * atishoo

การจัดเรียงเป็นนามแฝงกับบางสิ่งบางอย่าง? ลอง\sort

ด้วย

โลแคลที่ระบุโดยสภาวะแวดล้อมมีผลต่อลำดับการเรียง ตั้ง LC_ALL = C เพื่อรับลำดับการจัดเรียงดั้งเดิมที่ใช้ค่าไบต์ดั้งเดิม


ไม่มีนามแฝง ต้องเป็นคุณลักษณะเฉพาะของ ubuntu / debian
Aaron Digulla

1

รุ่น: sort (GNU coreutils) 8.26

ฉันทำแบบอินไลน์:

LANG=C sort FILE

หรือตามฟังก์ชั่น (เปลี่ยนไฟล์ต้นฉบับ):

dosort() { local file="$*"; LANG=C sort ${file} -o ${file}.swp; mv ${file}.swp ${file}; cat ${file} ;}

1

เพื่อให้คำตอบง่าย ๆ ตามความคิดเห็นของผู้อื่นนั่นไม่ได้เปลี่ยนแปลงสภาพแวดล้อมของคุณ:

input_program | LC_COLLATE=C sort | output_program

หรือ

LC_COLLATE=C sort < input_file > output_file

หรือการรวมกันของมัน


0

ด้วย GNU sort คุณสามารถใช้--dictionary-order:

NAME
       sort - sort lines of text files

SYNOPSIS
       sort [OPTION]... [FILE]...
       sort [OPTION]... --files0-from=F

DESCRIPTION
       Write sorted concatenation of all FILE(s) to standard output.

       With no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are mandatory for short options too.  Ordering options:

       -b, --ignore-leading-blanks
              ignore leading blanks

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