Text-Processing

辨識文件中重複的文本塊

  • October 1, 2014

有沒有一種方便的方法來辨識文件中重複或接近重複的文本塊?

我想用它來辨識程式碼重複。看起來有具有此功能的專業程序,但我不希望參與其中。

我希望有一個類似於 diff 的工具可以做一種“文件內”的差異。更好的是在單個文件 vimdiff 中。

如果逐行進行比較是可以接受的,那麼以下內容將告訴文件中哪些行重複text以及每行出現了多少次:

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

舉個例子,

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

使用通常的 unix 工具,假設輸入測試格式不太複雜,這可以擴展到逐段或逐句比較。

查找重複的段落

假設我們的文件text包含:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

以下命令標識顯示哪些段落出現多次:

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

這用於awk將文本分成段落(由空白行劃定),將換行符轉換為空格,然後將輸出(每段一行)傳遞給 sort 和 uniq 以計算重複的段落。

以上是用 GNU 測試的awk。對於其他awk的,將空行定義為段落(記錄)邊界的方法可能會有所不同。

引用自:https://unix.stackexchange.com/questions/158547