Làm cách nào để xóa các dòng có trong một tệp khỏi tệp khác?


10

Tôi có hai danh sách, một danh sách đầy đủ và một danh sách một phần. Tôi muốn một tập lệnh bash sẽ tìm kiếm danh sách đầy đủ cho bất kỳ dòng nào trong một phần, nếu có, chúng sẽ bị xóa khỏi danh sách đầy đủ. Có ai giúp được không?


Câu trả lời:


13

grepcó thể đọc nhiều mẫu từ một tệp, mỗi mẫu trên một dòng. Kết hợp với các tùy chọn -vđể xuất các dòng không khớp và -Fđể khớp các chuỗi thay vì regex và -xđể yêu cầu toàn bộ dòng khớp.

grep -Fvx -f partial.list complete.list >remaining.list &&
mv remaining.list complete.list

Rõ ràng dòng lệnh thứ hai chỉ khi bạn muốn ghi đè lên tệp chứa danh sách đầy đủ.

Nếu danh sách một phần là rất lớn và bạn không phiền khi sắp xếp lại danh sách, thì joincó thể nhanh hơn.


9

bạn cũng có thể dùng -

comm -23 file1 file2

các tập tin phải được sắp xếp để lệnh hoạt động đúng. các mục từ file2 sẽ bị xóa khỏi file1 trong đầu ra của lệnh


1
+1 để sử dụng comm. Tôi thực sự thích cách tiếp cận bằng cách sử dụng commtôi đã thực hiện bằng grep nhưng comm rất hay để so sánh các tệp theo mọi hướng.
рüффп

6

Nếu không có danh sách nào có các phần tử lặp lại, thì các mục sau sẽ hoạt động:

join -t$'\n' -v1 <(sort complete) <(sort partial)

Nếu danh sách có thể chứa các phần tử lặp lại và bạn chỉ muốn bỏ qua các phần lặp lại, bạn có thể sử dụng -ucờ trong các tiểu phần sắp xếp, phần này sẽ chỉ xuất các phần tử duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.