Câu trả lời đơn giản không hiệu quả đối với tôi vì tôi không nhận ra dòng comm
phù hợp cho dòng, vì vậy các dòng trùng lặp trong một tệp sẽ được in dưới dạng không tồn tại trong tệp còn lại. Ví dụ, nếu file1 chứa:
Alex
Bill
Fred
Và file2 chứa:
Alex
Bill
Bill
Bill
Fred
Sau đó comm -13 file1 file2
sẽ đầu ra:
Bill
Bill
Trong trường hợp của tôi, tôi muốn biết duy nhất mà tất cả các chuỗi trong tệp 2 tồn tại trong tệp 1, bất kể số lần dòng đó xảy ra trong mỗi tệp.
Giải pháp 1: sử dụng -u
(unique) cờ để sort
:
comm -13 <(sort -u file1) <(sort -u file2)
Giải pháp 2: (người đầu tiên "làm việc" câu trả lời tôi thấy) từ unix.stackexchange:
fgrep -v -f file1 file2
Lưu ý rằng nếu tệp 2 chứa dupli dòng cate không tồn tại ở tất cả trong file1, fgrep
sẽ xuất ra mỗi dòng trùng lặp.Cũng lưu ý rằng các thử nghiệm hoàn toàn phi khoa học của tôi trên một máy tính xách tay cho một bộ dữ liệu (khá lớn) cho thấy Giải pháp 1 (sử dụng comm
) nhanh gấp gần 5 lần so với Giải pháp 2 (sử dụng fgrep
).
Tôi sẽ thêm rằng điều này chỉ hoạt động nếu cả hai tập tin được sắp xếp. (Tôi biết OP đã đề cập đến ông đã sắp xếp các tệp, nhưng nhiều người, tôi đã bao gồm, đọc tiêu đề câu hỏi và sau đó chuyển đến câu trả lời) – user247866
@ user247866: May mắn thay comm là loại đủ để cho bạn biết nếu họ không được sắp xếp :) – marlar