Nếu mục tiêu của bạn là tìm các dòng chung hoặc không phổ biến, comm
đó sẽ là lệnh truy cập của tôi ở đây.
Nó so sánh hai tệp và hiển thị ba dòng của dònginin là dòng duy nhất cho tệp 1, các dòng duy nhất cho tệp 2 và các dòng xuất hiện trong cả hai tệp, tương ứng. Bạn cũng có thể truyền cờ cho nó để chặn bất kỳ đầu ra nào. Ví dụ, comm -1 file1 file2
sẽ chặn cột đầu tiên, những thứ duy nhất cho tệp1. comm -12 file1 file2
sẽ chỉ hiển thị những thứ trong cả hai tập tin.
Có một cảnh báo lớn: đầu vào phải được sắp xếp. Chúng ta có thể làm việc xung quanh điều này.
Điều này sẽ cho bạn thấy mọi thứ trong abc không có trong mno:
comm -23 <(sort abc.txt) <(sort mno.txt)
Và bạn có thể dẫn nó vào wc -l
để có được một số lượng.
Lý do tôi đi cùng comm
là một khi các tệp được sắp xếp, việc so sánh song song thực sự đơn giản. Nếu bạn đang đối phó với hàng triệu trong số này, điều đó sẽ tạo ra sự khác biệt.
Điều này có thể được chứng minh với một vài tệp giả. Tôi có một máy tính khá nhanh vì vậy để cho thấy sự khác biệt giữa các phương pháp, tôi cần một bộ mẫu voi ma mút. Tôi đã đạt tới 10 triệu chuỗi 10 ký tự cho mỗi tệp.
$ 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
Việc sắp xếp là những gì chiếm phần lớn thời gian trong tôi. Nếu chúng tôi giả vờ rằng abc.txt là tĩnh, chúng tôi có thể sắp xếp trước nó và điều đó làm cho các so sánh trong tương lai nhanh hơn nhiều:
$ sort abc.txt abc-sorted.txt
$ time comm -23 abc-sorted.txt <(sort mno.txt) | wc -l
... 0m7.426s
Bạn có thể nhìn vào những thứ này và xem xét một vài giây không liên quan nhưng tôi phải nhấn mạnh rằng những thứ này đang chạy trên một máy cao cấp. Nếu bạn muốn thực hiện điều này trên (ví dụ) Raspberry Pi 3, bạn sẽ xem xét các vòng quay chậm hơn nhiều và sự khác biệt sẽ tăng lên đến mức nó thực sự quan trọng.
grep -cxvFf abc.txt mno.txt
?