Identifikasi duplikat blok teks dalam suatu file

10

Apakah ada cara mudah untuk mengidentifikasi duplikat atau hampir duplikat blok teks dalam file?

Saya ingin menggunakan ini untuk mengidentifikasi duplikasi kode. Sepertinya ada program khusus dengan kemampuan ini, tetapi saya tidak ingin terlibat.

Saya berharap ada alat yang mirip dengan diff yang akan dapat melakukan semacam "dalam file" diff. Bahkan lebih baik dalam vimdiff file tunggal.

Praxeolitic
sumber
Apa yang vimdifftidak Anda lakukan di sini?
slm
Karena hanya ada satu file yang terlibat. Saya tidak tahu cara menggunakan vimdiff pada bagian terpisah dari file yang sama.
Praxeolitic
Begitu ya, saya rindu itu file tunggal.
slm

Jawaban:

13

Jika melakukan perbandingan baris demi baris dapat diterima, maka yang berikut akan memberi tahu baris mana yang diduplikasi dalam file textdan berapa kali masing-masing muncul:

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

Sebagai contoh,

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

Menggunakan alat unix yang biasa, ini dapat diperluas, dengan asumsi format tes input tidak terlalu rumit, untuk perbandingan paragraf demi paragraf atau kalimat-demi-kalimat.

Menemukan Paragraf Berulang

Misalkan file kita textmengandung:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

Perintah berikut mengidentifikasi menunjukkan paragraf mana yang muncul lebih dari sekali:

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

Ini digunakan awkuntuk memecah teks menjadi paragraf (digambarkan dengan baris kosong), mengubah baris baru menjadi spasi, dan kemudian meneruskan output, satu baris per paragraf, untuk mengurutkan dan uniq untuk menghitung paragraf yang digandakan.

Di atas diuji dengan GNU awk. Untuk yang lain awk, metode untuk mendefinisikan baris kosong sebagai batas paragraf (catatan) mungkin berbeda.

John1024
sumber
1
Saya memilih beberapa baris sekaligus.
Praxeolitic
1
@Praxeolitic Diperbarui untuk paragraf.
John1024