Xác định các khối văn bản trùng lặp trong một tệp


10

Có cách nào thuận tiện để xác định các khối văn bản trùng lặp hoặc gần trùng lặp trong một tệp không?

Tôi muốn sử dụng điều này để xác định sao chép mã. Có vẻ như có các chương trình đặc biệt với khả năng này nhưng tôi không muốn tham gia.

Tôi hy vọng có một công cụ tương tự như diff có thể thực hiện một loại "trong tệp" diff. Thậm chí tốt hơn sẽ là một trong một tập tin vimdiff.


Điều gì vimdiffkhông làm cho bạn ở đây?
slm

Bởi vì chỉ có một tập tin liên quan. Tôi không biết cách sử dụng vimdiff trên các phần riêng biệt của cùng một tệp.
Praxeolitic

Tôi thấy, tôi đã bỏ lỡ rằng đó là một tập tin duy nhất.
slm

Câu trả lời:


13

Nếu thực hiện so sánh từng dòng một thì có thể chấp nhận được, thì phần sau đây sẽ cho biết dòng nào được sao chép trong tệp textvà số lần mỗi dòng xuất hiện:

sort text | uniq -c | grep -vE '^\s*1 '

Ví dụ

$ cat text
alpha
beta
alpha
gamma
alpha
beta
$ sort text | uniq -c | grep -vE '^\s*1 '
      3 alpha
      2 beta

Sử dụng các công cụ unix thông thường, điều này có thể được mở rộng, giả sử định dạng kiểm tra đầu vào không quá phức tạp, để so sánh từng đoạn hoặc từng câu.

Tìm đoạn văn lặp đi lặp lại

Giả sử rằng tệp của chúng tôi textchứa:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

Lệnh sau xác định các đoạn nào xuất hiện nhiều lần:

$ awk -v RS=""  '{gsub(/\n/," "); print}' text | sort | uniq -c | grep -vE '^\s*1 '
      2 This is a paragraph.

Điều này sử dụng awkđể chia văn bản thành các đoạn văn (được mô tả bằng các dòng trống), chuyển đổi các dòng mới thành khoảng trắng và sau đó chuyển đầu ra, một dòng trên mỗi đoạn, để sắp xếp và uniq để đếm các đoạn trùng lặp.

Ở trên đã được thử nghiệm với GNU awk. Đối với các awkphương thức khác , phương pháp xác định các dòng trống dưới dạng ranh giới đoạn (bản ghi) có thể khác nhau.


1
Tôi upvote cho nhiều dòng cùng một lúc.
Praxeolitic

1
@Praxeolitic Cập nhật cho các đoạn văn.
John1024
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.