การเรียงลำดับตัวเลขในไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคด้วย Unix


8

ฉันมีไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคซึ่งมีลักษณะดังนี้:

100,00869184
6492,8361
1234,31
200,04071

ฉันต้องการที่จะใช้sortในการจัดเรียงไฟล์นี้ตัวเลขจากคอลัมน์แรกเท่านั้น

ผลลัพธ์ที่ต้องการ:

100,00869184
200,04071
1234,31
6492,8361

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

ทั้งสองsort -t',' -nและsort -t',' -nk1'ให้สิ่งนี้กับฉัน:

1234,31
200,04071
6492,8361
100,00869184

เรียงตามค่าเริ่มต้น (ไม่มีพารามิเตอร์) หรือใช้sort -t','ให้ฉันนี้:

100,00869184
1234,31
200,04071
6492,8361

และการเรียงลำดับเป็นตัวเลขsort -nให้สิ่งนี้แก่ฉัน:

1234,31
200,04071
6492,8361
100,00869184

ฉันจะใช้การเรียงลำดับเพื่อให้ได้ผลลัพธ์ตามที่ต้องการได้อย่างไร

แก้ไขเพื่อเพิ่ม: นี่เป็นการดำเนินการครั้งเดียวเพื่อสร้างรายการที่เรียงลำดับประมาณ 7 ล้านบรรทัดดังนั้นการแก้ปัญหาหรือวิธีการนอกรีตอื่น ๆ จึงเป็นที่ยอมรับอย่างสมบูรณ์


ตัวอย่างที่ฉันเห็นที่นี่ดูเหมือนจะแสดง-tตัวเลือกว่ามีช่องว่างระหว่าง-tตัวละครและตัวละคร
SeanC

ความคิดแรก - ใช้การตัด มันเลือกเฉพาะคอลัมน์ที่เฉพาะเจาะจงตามตัวคั่นที่กำหนด อีกทั้งคำตอบของ "Artem Ice" กับ tr. ฉันรักทีอาร์ ฉันขี้เกียจเกินไปที่จะเขียนและทดสอบสิ่งนี้ ไชโย!
Vorac

อาจเป็นไปได้สำหรับ tab char: stackoverflow.com/questions/1037365/ …
Ciro Santilli i 病毒审查审查六四事件法轮功

คำตอบ:


9

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

ฉันตั้งโลแคลเป็นภาษาสเปน (โบลิเวีย) เพื่อให้เครื่องหมายจุลภาคถือว่าเป็นจุดทศนิยมแล้วการเรียงลำดับตัวเลขมาตรฐานก็ใช้กลอุบายได้

$ export LC_NUMERIC="es_BO.utf8"

$ cat test.csv
100,00869184
6492,8361
1234,31
200,04071

$ sort -n test.csv
100,00869184
200,04071
1234,31
6492,8361

อ่าฉันจะแนะนำให้ใช้ภาษาเยอรมันหรือที่คล้ายกัน นึกไม่ออกว่าจะมีอะไรอีกในตอนนี้โดยไม่สามารถทดสอบหรือใช้เครื่องมืออะไรได้บ้างเนื่องจากนี่เป็นรุ่น Unix ที่หายาก
slhck

@slhck ดูเหมือนว่าจะเป็นปัญหาหลัก ๆ ของปัญหาที่ฉันติดอยู่ใน UNIX :) ขอบคุณสำหรับความช่วยเหลือในการพาฉันไปยังทางออกโดยไม่คำนึงถึง
dpatchery

6

GNU's sortทำสิ่งนี้ตามค่าเริ่มต้น:

$ cat test
100,00869184
6492,8361
1234,31
200,04071

$ gsort -nt',' < test
100,00869184
200,04071
1234,31
6492,8361

เวอร์ชัน:

$ gsort --version
sort (GNU coreutils) 8.19

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

เพื่อตรวจสอบเรื่องนี้เพียงแค่ป้อนlocaleเทอร์มินัล มีการLC_NUMERICตั้งค่าen_US.UTF-8อาจจะ? สิ่งนี้จะอธิบายลำดับการเรียงที่ไม่ถูกต้อง ตั้งค่ากลับเป็นC:

export LC_NUMERIC=C

จากนั้นลองsortคำสั่งของคุณอีกครั้ง หากคุณต้องการตั้งค่าโกลบอลเป็นlocaleให้Cทำดังนี้:

export LC_ALL=C

ฉันไม่สามารถเข้าถึง GNU ในสภาพแวดล้อมของฉัน เป็นสิ่งที่ฉันสามารถเอาออกได้อย่างง่ายดายเมื่อฉันเสร็จสิ้นหรือไม่ HMU ในการแชทถ้ามีคนต้องการช่วยฉันทำสิ่งนี้ ... ฉันเป็นมือใหม่ของ UNIX
dpatchery

ฉันค่อนข้างแน่ใจว่ามันเป็นเพียงlocaleปัญหา แต่sort --versionสำหรับคุณจริง ๆ แล้ว?
slhck

การเรียงลำดับ - รุ่นทำให้ฉันมีข้อโต้แย้งที่ผิดกฎหมาย --คำสั่งไม่ได้ทำงานให้ฉันในอดีตอย่างใดอย่างหนึ่ง ฉันตรวจสอบหน้าคนและไม่มีรุ่นที่เรียกออกมาอย่างชัดเจน แต่จะแสดงรายการ "HP-UX 11i เวอร์ชัน 2: สิงหาคม 2546" ถ้านั่นช่วยได้เลย LC_NUMERIC ของฉันถูกตั้งค่าเป็น "C"
dpatchery

ตัวอย่างภาษาเยอรมันจะใช้,เป็นตัวคั่นทศนิยม ฉันไม่เคยใช้ HP-UX มาก่อน
slhck

1

ลองเพิ่ม-gตัวเลือกที่ใช้ในการเรียงลำดับตัวเลข

ลอง:

sort -t',' -g <whatever>

-nการเรียงลำดับเป็นตัวเลขไม่ใช่หรือ -g ให้ฉันตัวเลือกที่ผิดกฎหมาย
dpatchery

-gเป็นgeneral-numeric-sortตัวเลือกและที่จริงควรจะมีอยู่ในรุ่นเมื่อเร็ว ๆ sortนี้ของ @dpatchery
slhck

นี่คือที่สถานที่ของฉันในการทำงานดังนั้นฉันเกือบจะแน่นอนไม่ได้มีรุ่นล่าสุด :)
dpatchery

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