So sánh hai danh sách URL và in các URL mới được thêm vào một tệp mới


8

Ban đầu, tôi đang tạo hai tệp chứa danh sách URL, tôi sẽ đề cập đến chúng như oldnew. Tôi muốn so sánh hai tệp và nếu có bất kỳ URL nào trong newtệp không có trong oldtệp, tôi muốn các tệp này được hiển thị trong một extra_urlstệp.

Bây giờ, tôi đã đọc một số thứ về việc sử dụng difflệnh nhưng từ những gì tôi có thể nói, điều này cũng phân tích thứ tự của thông tin. Tôi không muốn đơn hàng có bất kỳ ảnh hưởng nào đến đầu ra. Tôi chỉ muốn các URL bổ sung newđược in vào extra_urlstệp, bất kể chúng được đặt theo thứ tự nào trong hai tệp còn lại.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


14

Bạn có thể sử dụng commlệnh để so sánh hai tệp và hiển thị có chọn lọc các dòng duy nhất với một hoặc một hoặc các dòng chung. Nó đòi hỏi các đầu vào phải được sắp xếp, nhưng bạn có thể sắp xếp chúng một cách nhanh chóng, bằng cách sử dụng thay thế quá trình.

comm -13 <(sort old.txt) <(sort new.txt)

Nếu bạn đang sử dụng một phiên bản bashkhông hỗ trợ thay thế quá trình, nó có thể được mô phỏng bằng các đường ống có tên. Một ví dụ được hiển thị trong Wikipedia .


Súc tích nhưng hiệu quả - chính xác những gì cần thiết, một chút mã tuyệt vời cho những gì tôi yêu cầu.
neilH

Hmm, nhưng nếu đầu vào được sắp xếp, thì diffsẽ làm điều tương tự, phải không?
justhalf

diffsẽ cho thấy tất cả sự khác biệt. commcho phép bạn chọn xem bạn muốn xem các dòng từ tệp 1, tệp 2 hoặc những dòng họ có chung.
Barmar

Xin chào Barmar, không chắc bạn sẽ kiểm tra điều này nhưng chỉ cần thực hiện, tôi đã chuyển tập lệnh này lên Synology Nas của tôi để chạy từ đó. Kể từ khi chạy tập lệnh của tôi từ Synology, giờ tôi gặp lỗi cú pháp: dòng 60: lỗi cú pháp: không mong muốn "("
neilH

Phiên bản nào của bashnó đang chạy? Nó có thể không hỗ trợ thay thế quá trình.
Barmar

6

Tôi sẽ chỉ sử dụng grep:

grep -vFf old new > extra_urls

Giải trình

  • -f: bảo grepđọc các mẫu tìm kiếm của nó từ một tệp. Trong trường hợp này , old.
  • -v : bảo grep đảo ngược trận đấu, chỉ in các dòng không khớp.
  • -F: bảo grep diễn giải các mẫu tìm kiếm của nó dưới dạng chuỗi, không phải biểu thức chính quy. Bằng cách đó, .URL sẽ được khớp theo nghĩa đen.

Kết hợp lại, chúng tạo grepra bất kỳ dòng nào trong newđó không có trong old. Thứ tự của các URL trong tệp là không liên quan.


Xin chào terdon, Cảm ơn bạn đã đóng góp. Tôi vừa mới thử nghiệm điều này và nó đã tạo ra một "url bổ sung" trống mặc dù có các url mới trong tệp "mới".
neilH

@ bms9nmh hmm, thật lạ. Vui lòng chỉnh sửa câu hỏi của bạn để đưa ra một ví dụ về các tập tin đầu vào của bạn. Bạn cũng có thể muốn vào phòng trò chuyện của trang web nơi chúng tôi có thể thảo luận thêm về vấn đề này.
terdon

2
Bạn sẽ muốn thêm -Fcho các mẫu văn bản đơn giản
glenn jackman

1

Vì thứ tự là quan trọng đối với bạn, sử dụng awk

awk '
    NR == FNR {old[$1]=1; next}
    !($1 in old)
' old new > extra

1
Hi glen, chỉ để làm rõ, trật tự không quan trọng. Thứ tự của url không phải là vấn đề, chỉ là sự khác biệt giữa hai tệp tức là url bổ sung. Tôi không muốn sự khác biệt để tạo hiệu ứng đầu ra theo bất kỳ cách nào.
neilH

@ bms9nmh: bạn có thể đổi > extrasang | sort > extra. hoặc | sort -u > extranếu bạn chỉ muốn một url mới xuất hiện trong đầu ra một lần, bất kể số lần nhập đó là bao nhiêu lần. Thứ tự đầu vào có thể ảnh hưởng đến thứ tự đầu ra trừ khi bạn làm thêm ở đâu đó trên đường đi để ngăn chặn nó.
Steve Jessop

@steve, meh, commlà câu trả lời tốt nhất cho câu hỏi này, mặc dù grep -Fvflà tốt quá
glenn jackman

0

Tôi có một ứng dụng gọi là meld. Nó cho phép xem hai (hoặc ba) tệp, cạnh nhau, cho thấy sự khác biệt và cho phép sao chép có chọn lọc từ cái này sang cái kia hoặc xóa các ký tự.

Meld có thể được cài đặt từ một thiết bị đầu cuối với

sudo apt-get install meld 
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.