หากเป้าหมายของคุณคือการค้นหาบรรทัดทั่วไปหรือผิดปกติcomm
คำสั่งของฉันจะไปที่นี่
มันเปรียบเทียบสองไฟล์และรายการ - ในสามคอลัมน์ - บรรทัดที่ไม่ซ้ำกับไฟล์ 1, บรรทัดที่ไม่ซ้ำกับไฟล์ 2 และบรรทัดที่ปรากฏในไฟล์ทั้งสองตามลำดับ คุณสามารถส่งผ่านแฟล็กเพื่อยับยั้งเอาต์พุตนี้ด้วย เช่นcomm -1 file1 file2
จะระงับคอลัมน์แรกสิ่งที่ไม่ซ้ำกับ file1 comm -12 file1 file2
จะแสดงเฉพาะสิ่งต่าง ๆ ในไฟล์ทั้งสอง
มีข้อแม้ใหญ่หนึ่งข้อ: อินพุตจะต้องเรียงลำดับ เราสามารถแก้ไขสิ่งนี้ได้
สิ่งนี้จะแสดงให้คุณเห็นทุกอย่างเป็นตัวอักษร abc ซึ่งไม่ได้อยู่ใน mno:
comm -23 <(sort abc.txt) <(sort mno.txt)
และคุณสามารถไปป์นั้นwc -l
ให้ได้จำนวน
เหตุผลที่ฉันไปด้วยcomm
คือเมื่อไฟล์เรียงลำดับแล้วการเปรียบเทียบแบบเคียงข้างกันเป็นเรื่องง่ายมาก ๆ หากคุณจัดการกับสิ่งเหล่านี้นับล้านสิ่งนั่นจะสร้างความแตกต่าง
สิ่งนี้สามารถสาธิตได้ด้วยไฟล์จำลองสองสามไฟล์ ฉันมีคอมพิวเตอร์ที่ค่อนข้างเร็วดังนั้นเพื่อแสดงความแตกต่างระหว่างวิธีฉันต้องการชุดตัวอย่างแมมมอ ธ ค่อนข้างมาก ฉันได้ไป 10 ล้านสายอักขระ 10 อักขระต่อไฟล์
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > abc.txt
$ cat /dev/urandom | tr -dc '0-9' | fold -w 10 | head -10000000 > mno.txt
$ time comm -23 <(sort abc.txt) <(sort mno.txt) | wc -l
... 0m10.653s
$ time grep -Fcxv -f abc.txt mno.txt
... 0m23.920s
$ time grep -Fcwv -f abc.txt mno.txt
... 0m40.313s
$ time awk 'NR==FNR{a[$0]++};NR!=FNR && a[$0]' abc.txt mno.txt | wc -l
... 0m12.161s
การเรียงลำดับเป็นสิ่งที่ใช้เวลาส่วนใหญ่ในตัวฉัน หากเราทำท่าว่า abc.txt เป็นแบบสแตติกเราสามารถจัดเรียงล่วงหน้าได้และทำให้การเปรียบเทียบในอนาคตเร็วขึ้นมาก:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
คุณอาจมองไปที่สิ่งเหล่านี้และพิจารณาสักครู่หนึ่งที่ไม่เกี่ยวข้อง แต่ฉันต้องเน้นว่าสิ่งเหล่านี้กำลังทำงานอยู่บนเครื่องระดับไฮเอนด์ หากคุณต้องการทำเช่นนี้ใน (เช่น) Raspberry Pi 3 คุณจะต้องดูการหยุดซ่อมบำรุงที่ช้ากว่ามากและความแตกต่างจะเพิ่มขึ้นจนถึงจุดที่สำคัญจริงๆ
grep -cxvFf abc.txt mno.txt
หรือ