ฉันเคยcomm
เปรียบเทียบไฟล์ที่เรียงสองไฟล์ แต่ละบรรทัดในไฟล์เหล่านี้เป็นจำนวนเต็มบวก แต่ผลลัพธ์แสดงให้เห็น
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
ทำไมข้อผิดพลาดถึงแม้ว่าไฟล์ทั้งสองนี้ถูกจัดเรียงแล้ว?
ฉันเคยcomm
เปรียบเทียบไฟล์ที่เรียงสองไฟล์ แต่ละบรรทัดในไฟล์เหล่านี้เป็นจำนวนเต็มบวก แต่ผลลัพธ์แสดงให้เห็น
comm: file 1 is not in sorted order
comm: file 2 is not in sorted order
ทำไมข้อผิดพลาดถึงแม้ว่าไฟล์ทั้งสองนี้ถูกจัดเรียงแล้ว?
คำตอบ:
comm
ต้องใช้การจัดเรียงคำศัพท์ (ธรรมดาsort
) ไม่ใช่การเรียงลำดับตัวเลข ( sort -n
) ตัวอย่างเช่นมันต้องการลำดับต่อไปนี้:
1
2000
300
ไม่ใช่ลำดับต่อไปนี้:
1
300
2000
แก้ไขสิ่งนี้และปัญหาควรหายไป สำหรับกรณีที่ลึกลับมากขึ้นที่comm
สถานที่เกิดเหตุ 's อาจจะแตกต่างจากsort
สถานที่เกิดเหตุคุณอาจต้องการที่จะทำงานsort
และcomm
มีLC_COLLATE=C
ในสภาพแวดล้อมของพวกเขาที่จะใช้การสั่งซื้อไบต์พื้นเมือง
sort -n
sort
ด้วยและโดยไม่ต้อง-n
สวิทช์และแสดงให้เห็นเพียงกับ-n
สวิทช์ที่คุณสามารถบรรลุที่ถูกต้องเพิ่มขึ้นเพื่อที่คุณจะต้องยอมรับในคำตอบของคุณเอง
comm
แท้จริงต้องLC_COLLATE
สั่งซื้อ d เพียงเพื่อบอกว่าข้อผิดพลาดในคำตอบของคุณนั้นไม่ใช่เครื่องสำอางอย่างหมดจดสำหรับตัวอย่างนอกเหนือจากชุดทดสอบของคุณ ... ไม่มีใครถามถึงการเรียงลำดับตัวเลขเชิงบวก
OP ได้รับข้อผิดพลาดเกี่ยวกับ " ไฟล์ไม่เรียงตามลำดับ " เมื่อใช้comm
เพื่อเปรียบเทียบจำนวนเต็มบวกในไฟล์ไม่ใช่ข้อความ ดังนั้นเราจึงจัดการกับตัวเลขที่ไม่ใช่ทศนิยม
ขึ้นอยู่กับการใช้งานของ-n
สวิตช์ที่มีsort
คำสั่งที่ใช้ในการเรียงลำดับผลลัพธ์ที่ได้รับการเรียงลำดับผลลัพธ์ที่comm
ส่งกลับcomm
อาจแตกต่างกันมาก:
คำย่อ : การใช้-n
สวิตช์ที่มีการเรียงลำดับจะส่งผลให้มีการสั่ง "จำนวนเต็มบวก" ในชุดของตัวเลขที่เพิ่มขึ้น " ข้อผิดพลาด " สามารถระงับได้โดยใช้comm
สวิตช์ `s--nocheck-order
Byte สั่งซื้อ : มีไม่ใช้กับ -n switch
กำหนดการเรียงลำดับซึ่งสามารถเปลี่ยนแปลงได้ตามวิธีการตั้งค่าบนโฮสต์ที่คำสั่งถูกเรียกใช้งาน นี่คืออินพุตที่คาดไว้ตามค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่นี่: Reference1และReference2sort
LC_COLLATE
locale
comm
LC_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
สวิตช์ แต่ส่งกลับข้อผิดพลาดเกี่ยวกับลำดับของจำนวนเต็มบวกที่ไม่ได้เรียงในไฟล์ด้วยตนเอง
ใช้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 ที่ทำให้เกิดปัญหาซึ่งจำเป็นต้องมีการขยายเพิ่มเติม มีความสุขเสมอที่ได้ตรวจสอบงานของฉัน: วิธีเดียวที่เราจะทำได้ดีกว่าคือถ้าเราผลักดันและท้าทายเพื่อนร่วมงานของเราตลอดเวลา