Bir dosyadaki yinelenen metin bloklarını tanımlama


10

Bir dosyadaki yinelenen veya neredeyse yinelenen metin bloklarını tanımlamanın uygun bir yolu var mı?

Kod çoğaltmayı tanımlamak için bunu kullanmak istiyorum. Bu özelliğe sahip özel programlar var gibi gözüküyor ama buna dahil olmak istemiyorum.

Ben "bir dosya içinde" fark bir tür yapacak diff benzer bir araç umuyorum. Daha da iyisi tek bir dosya içinde vimdiff olurdu.


Ne gelmez vimdiffburada sizi yapamaz?
slm

Çünkü sadece bir dosya var. Aynı dosyanın ayrı bölümlerinde vimdiff nasıl kullanılacağını bilmiyorum.
Praxeolitic

Anlıyorum, tek bir dosya olduğunu özledim.
slm

Yanıtlar:


13

Karşılaştırmayı satır satır yapmak kabul edilebilirse, aşağıdakiler dosyada hangi satırların çoğaltıldığını textve her birinin kaç kez göründüğünü söyler :

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

Örnek olarak,

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

Her zamanki unix araçlarını kullanarak, giriş testi formatının çok karmaşık olmadığı varsayılarak, paragraf paragraf veya cümle cümle karşılaştırmalarına genişletilebilir.

Tekrarlanan Paragrafları Bulma

Diyelim ki dosyamız textşunları içeriyor:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

Aşağıdaki komut, hangi paragrafların bir kereden fazla göründüğünü gösterir:

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

Bu awk, metni paragraflara ayırmak için kullanır (boş satırlarla tanımlanır), yeni satırları boşluklara dönüştürür ve sonra yinelenen paragrafları saymak ve sıralamak için çıktıyı paragraf başına bir satır olarak geçirir.

Yukarıdakiler GNU ile test edilmiştir awk. Diğerleri awkiçin, boş satırları paragraf (kayıt) sınırları olarak tanımlama yöntemi farklılık gösterebilir.


1
Bir seferde birden fazla hat için oy kullanırım.
Praxeolitic

1
@Praxeolitic Paragraflar için güncellendi.
John1024
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.