awk để giải cứu!
Giải pháp này không yêu cầu đầu vào được sắp xếp. Bạn phải cung cấp fileB trước.
awk 'NR==FNR{a[$0];next} !($0 in a)' fileB fileA
trả lại
A
C
Làm thế nào nó hoạt động?
NR==FNR{a[$0];next} thành ngữ là để lưu trữ tệp đầu tiên trong một mảng kết hợp làm khóa cho bài kiểm tra "chứa" sau này.
NR==FNR đang kiểm tra xem chúng tôi có đang quét tệp đầu tiên hay không, trong đó bộ đếm dòng toàn cầu (NR) bằng với bộ đếm dòng tệp hiện tại (FNR).
a[$0] thêm dòng hiện tại vào mảng kết hợp làm khóa, lưu ý rằng điều này hoạt động giống như một tập hợp, trong đó sẽ không có bất kỳ giá trị trùng lặp (khóa) nào
!($0 in a)Bây giờ chúng tôi đang ở (các) tệp tiếp theo, inlà một thử nghiệm chứa, ở đây nó kiểm tra xem dòng hiện tại có nằm trong tập hợp mà chúng tôi đã điền trong bước đầu tiên từ tệp đầu tiên hay không, !phủ nhận điều kiện. Điều còn thiếu ở đây là hành động, theo mặc định là {print}và thường không được viết rõ ràng.
Lưu ý rằng điều này bây giờ có thể được sử dụng để loại bỏ các từ trong danh sách đen.
$ awk '...' badwords allwords > goodwords
với một thay đổi nhỏ, nó có thể xóa nhiều danh sách và tạo các phiên bản đã được làm sạch.
$ awk 'NR==FNR{a[$0];next} !($0 in a){print > FILENAME".clean"}' bad file1 file2 file3 ...