comm: ไฟล์ไม่เรียงลำดับ


9

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

comm: file 1 is not in sorted order
comm: file 2 is not in sorted order

ทำไมข้อผิดพลาดถึงแม้ว่าไฟล์ทั้งสองนี้ถูกจัดเรียงแล้ว?


ในกรณีของฉันฉันได้เรียง (lexicographic จากน้อยไปมาก) ไฟล์โดยใช้ notepad ++ ซึ่งพิจารณาตัวอักษรตัวเล็กและตัวพิมพ์ใหญ่แยกกันเช่น จะปรากฏขึ้นหลังจาก 'Z' ในการเรียงลำดับจากน้อยไปมาก สิ่งนี้แตกต่างจากการเรียงลำดับยูทิลิตี (ทุบตี) เพื่อตรวจสอบสิ่งนี้ฉันแปลงทุกบรรทัดเป็นตัวพิมพ์ใหญ่แล้วเรียงลำดับใน np ++ ไม่ต้องบ่นอีกต่อไป
Sahil Singh

คำตอบ:


10

commต้องใช้การจัดเรียงคำศัพท์ (ธรรมดาsort) ไม่ใช่การเรียงลำดับตัวเลข ( sort -n) ตัวอย่างเช่นมันต้องการลำดับต่อไปนี้:

1
2000
300

ไม่ใช่ลำดับต่อไปนี้:

1
300
2000

แก้ไขสิ่งนี้และปัญหาควรหายไป สำหรับกรณีที่ลึกลับมากขึ้นที่commสถานที่เกิดเหตุ 's อาจจะแตกต่างจากsortสถานที่เกิดเหตุคุณอาจต้องการที่จะทำงานsortและcommมีLC_COLLATE=Cในสภาพแวดล้อมของพวกเขาที่จะใช้การสั่งซื้อไบต์พื้นเมือง


วิธีการทำให้เรียงลำดับตัวเลข?
wenzi


" การสั่งซื้อ Lexographic " เป็นที่ที่ชุดของตัวเลขเพิ่มในคำสั่งให้ seeries- คุณได้มันไปข้างหลังในคำตอบของคุณ: mathworld.wolfram.com/LexicographicOrder.html โปรดดูคำตอบด้านล่างของฉันซึ่งผลการทดสอบเปรียบเทียบการใช้sort ด้วยและโดยไม่ต้อง-nสวิทช์และแสดงให้เห็นเพียงกับ-nสวิทช์ที่คุณสามารถบรรลุที่ถูกต้องเพิ่มขึ้นเพื่อที่คุณจะต้องยอมรับในคำตอบของคุณเอง
F1Linux

@ F1Linux อะไรนะ? commแท้จริงต้องLC_COLLATEสั่งซื้อ d เพียงเพื่อบอกว่าข้อผิดพลาดในคำตอบของคุณนั้นไม่ใช่เครื่องสำอางอย่างหมดจดสำหรับตัวอย่างนอกเหนือจากชุดทดสอบของคุณ ... ไม่มีใครถามถึงการเรียงลำดับตัวเลขเชิงบวก
Chris Down

@ChrisDown คำตอบของคุณที่ฉันตอบกลับไม่ใช่สิ่งที่ฉันเห็นว่าคุณเพิ่งแก้ไขและมีเพียงตอนนี้ที่กล่าวถึง " LC_COLLATE " คือ: " comm ต้องการเรียงลำดับอักษรศาสตร์ไม่ใช่เรียงลำดับตัวเลขแก้ไขสิ่งนี้และปัญหาควรหายไป " ตอนนี้ที่ไหน ในมีอะไรเกี่ยวกับ "LC_COLLATE" ซึ่งเป็นสัตว์ที่แตกต่างกันมากกว่าการจัดเรียง "_Lexographic" แน่นอนคำตอบแรกของคุณนั้นกระจัดกระจายเหลือเกินเพียงแค่บรรทัดเดียวที่ไม่มีตัวอย่างซึ่งเป็นสิ่งที่กระตุ้นให้ฉันกลับมาถามคำถามอีกครั้งด้วยคำตอบของฉันเอง ฉันกำลังอัปเกรดคำตอบที่อัปเดตของคุณเพราะ "LC_COLLATE" ทำงานได้อย่างแน่นอนที่นี่ตามที่คุณบันทึกไว้
F1Linux

0

ปรับปรุงคำตอบ:

ปัญหา:

OP ได้รับข้อผิดพลาดเกี่ยวกับ " ไฟล์ไม่เรียงตามลำดับ " เมื่อใช้commเพื่อเปรียบเทียบจำนวนเต็มบวกในไฟล์ไม่ใช่ข้อความ ดังนั้นเราจึงจัดการกับตัวเลขที่ไม่ใช่ทศนิยม

คำตอบสั้น ๆ :

ขึ้นอยู่กับการใช้งานของ-nสวิตช์ที่มีsortคำสั่งที่ใช้ในการเรียงลำดับผลลัพธ์ที่ได้รับการเรียงลำดับผลลัพธ์ที่commส่งกลับcommอาจแตกต่างกันมาก:

คำย่อ : การใช้-nสวิตช์ที่มีการเรียงลำดับจะส่งผลให้มีการสั่ง "จำนวนเต็มบวก" ในชุดของตัวเลขที่เพิ่มขึ้น " ข้อผิดพลาด " สามารถระงับได้โดยใช้commสวิตช์ `s--nocheck-order

Byte สั่งซื้อ : มีไม่ใช้กับ -n switch กำหนดการเรียงลำดับซึ่งสามารถเปลี่ยนแปลงได้ตามวิธีการตั้งค่าบนโฮสต์ที่คำสั่งถูกเรียกใช้งาน นี่คืออินพุตที่คาดไว้ตามค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่นี่: Reference1และReference2sortLC_COLLATElocalecommLC_COLLATE

ข้อผิดพลาดเป็นปัญหาหรือไม่ ขึ้นอยู่กับสิ่งที่คุณพยายามทำ ในขณะที่คุณจะได้เห็นในด้านล่างตัวอย่างcommส่งกลับผลลัพธ์เดียวกันหลังจากเปรียบเทียบไฟล์ที่มีหรือโดยไม่ต้อง sort `s-nสวิตช์แม้ว่าการสั่งซื้อของพวกเขาจะแตกต่างกันไปในลักษณะดังกล่าวข้างต้นขึ้นอยู่กับว่า-n switchจะใช้กับsortคำสั่ง ตัวฉันเองชอบ "คำย่อ" สั่งจำนวนผลลัพธ์ที่เพิ่มขึ้นในชุด

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

ในการทดสอบ:

เราจะเปรียบเทียบผลลัพธ์ของcommคำสั่งทั้งที่มีและไม่มี-nสวิตช์ ฉันได้เพิ่มความซับซ้อนของชุดข้อมูลทดสอบตัวอย่างตามคำขอของ Kusalananda:

ข้อมูลการทดสอบ :

file1.txt :

40
110000
2200
6
33000

file2.txt :

2200
40
33000
6
440000

ทางแยก :

แสดงเฉพาะตัวเลขทั่วไปสำหรับไฟล์BOTH

ไม่มี-nสวิตช์:

comm -12 <(sort file1.txt) <(sort file2.txt)

2200
33000
40
6

ผลลัพธ์ : ถูกต้อง แต่ส่งคืนในลำดับที่ไม่ได้จัดเรียง

ด้วย -nสวิตช์:

comm -12 <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000
comm: file 1 is not in sorted order

ผลลัพธ์ : ถูกต้อง แต่ส่งกลับในคำสั่งที่เรียงลำดับLEXOGRAPHIC การดำเนินการเสร็จสมบูรณ์และส่งคืนผลลัพธ์เดียวกับที่ใช้commโดยไม่มี-nสวิตช์ แต่อยู่ในรายการที่เรียงลำดับ

ความแตกต่าง :

แสดงเฉพาะตัวเลขที่ไม่ซ้ำกันในแต่ละไฟล์:

ไม่มี-nสวิตช์:

comm -3 <(sort file1.txt) <(sort file2.txt)

110000
         440000

ผลลัพธ์ : ถูกต้อง - ตัวเลขเหล่านี้เป็นเอกสิทธิ์ของแต่ละไฟล์

ด้วย -nสวิตช์:

comm -3 <(sort -n file1.txt) <(sort -n file2.txt)

110000
comm: file 1 is not in sorted order
         440000

ผลลัพธ์ : ถูกต้องเป็นผลลัพธ์เดียวกับที่commไม่มี-nสวิตช์ แต่ส่งกลับข้อผิดพลาดเกี่ยวกับลำดับของจำนวนเต็มบวกที่ไม่ได้เรียงในไฟล์ด้วยตนเอง

โซลูชันสำหรับผลลัพธ์ LEXOGRAPHIC:

ใช้comm`s --nocheck-orderสวิทช์ในการปราบปรามการเกิดข้อผิดพลาด เนื่องจากเรารู้ว่าตัวเลขไม่ได้ถูกจัดเรียงในแต่ละไฟล์ แต่ผลลัพธ์ที่ส่งคืนมาcomm -nนั้นถูกต้องข้อผิดพลาดสามารถถูกละเว้นได้อย่างปลอดภัยโดยการระงับ:

ทางแยก :

comm -12 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

6
40
2200
33000

ความแตกต่าง :

comm -3 --nocheck-order <(sort -n file1.txt) <(sort -n file2.txt)

110000
         440000

สรุป:

ข้อผิดพลาด " ไฟล์ไม่เรียงตามลำดับ " เมื่อส่งคืนการเรียงลำดับจำนวนเต็มบวกที่ป้อนไปcommไม่ได้หมายความว่าผลลัพธ์ที่ส่งคืนโดยใช้-nสวิตช์commที่ผิด แน่นอนว่าการใช้comm -nผลตอบแทนที่ถูกต้องเป็นระเบียบในการเรียงลำดับ!

ขอขอบคุณ @dhag @kusalananda @ChrisDown ที่ทำให้เกิดปัญหาซึ่งจำเป็นต้องมีการขยายเพิ่มเติม มีความสุขเสมอที่ได้ตรวจสอบงานของฉัน: วิธีเดียวที่เราจะทำได้ดีกว่าคือถ้าเราผลักดันและท้าทายเพื่อนร่วมงานของเราตลอดเวลา


คำตอบที่ได้รับการโหวตสูงสุดระบุว่า "comm ต้องการการจัดเรียงพจนานุกรม" แต่คุณดูเหมือนจะเรียงลำดับตัวเลข ดูเหมือนว่าจะตกในบางกรณี
dhag

ทดสอบอีกครั้งโดยใช้ตัวเลขที่เรียงลำดับตัวเลขและพจนานุกรมต่าง ๆ เช่น 1,000, 200, 30, 4
Kusalananda

@Kusalananda เพียงรวมความคิดเห็นที่เป็นประโยชน์และมีประโยชน์ของคุณไว้ในคำตอบที่อัปเดตแล้วของฉัน จำเป็นที่สุดสำหรับข้อเสนอแนะของคุณ!
F1Linux

@dhag เพิ่งอัปเดตคำตอบของฉันเพื่อรวมความคิดเห็นของคุณ & ของ Kusalanada จำเป็นมากที่สุดสำหรับคุณที่สละเวลาและความพยายามในการทบทวนคำตอบของฉัน
F1Linux

1
@JeffSchaller คำตอบที่ฉันตอบในตอนแรกพูดถึงการเรียงลำดับของ "Lexographic" ไม่ใช่ "LC_COLLATE" เหมือนกับคำตอบที่แก้ไขใหม่ของ Chris ฉันตอบคริสที่ถูกต้องและอัปเดตคำตอบที่อัปเดตของเขา "Lexographic" & "LC_COLLATE" เป็นสัตว์ที่แตกต่างกัน ขอบคุณ Jeff-
F1Linux
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.