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?
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:
grep
có 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ì join
có thể nhanh hơn.
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
comm
. Tôi thực sự thích cách tiếp cận bằng cách sử dụng comm
tô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.
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 -u
cờ 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.