ฉันเคย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และ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สวิตช์ แต่ส่งกลับข้อผิดพลาดเกี่ยวกับลำดับของจำนวนเต็มบวกที่ไม่ได้เรียงในไฟล์ด้วยตนเอง
ใช้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 ที่ทำให้เกิดปัญหาซึ่งจำเป็นต้องมีการขยายเพิ่มเติม มีความสุขเสมอที่ได้ตรวจสอบงานของฉัน: วิธีเดียวที่เราจะทำได้ดีกว่าคือถ้าเราผลักดันและท้าทายเพื่อนร่วมงานของเราตลอดเวลา