Identifizieren Sie doppelte Textblöcke in einer Datei

10

Gibt es eine bequeme Möglichkeit, doppelte oder nahezu doppelte Textblöcke in einer Datei zu identifizieren?

Ich möchte dies zum Identifizieren von Codeduplikationen verwenden. Es sieht so aus, als gäbe es Spezialprogramme mit dieser Fähigkeit, aber ich möchte mich nicht darauf einlassen.

Ich hoffe, es gibt ein Tool ähnlich dem Diff, das eine Art Diff "innerhalb einer Datei" ausführen kann. Noch besser wäre ein innerhalb einer einzigen Datei vimdiff.

Praxeolitisch
quelle
Was tut vimdiffdir hier nicht?
slm
Weil es nur eine Datei gibt. Ich weiß nicht, wie ich vimdiff für einzelne Teile derselben Datei verwenden soll.
Praxeolitic
Ich habe vermisst, dass es eine einzelne Datei war.
slm

Antworten:

13

Wenn der zeilenweise Vergleich akzeptabel ist, wird im Folgenden angegeben, welche Zeilen in der Datei dupliziert werden textund wie oft jede Zeile angezeigt wird:

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

Als Beispiel,

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

Mit den üblichen Unix-Tools könnte dies unter der Annahme, dass das Eingabetestformat nicht zu komplex ist, auf Vergleiche von Absatz zu Absatz oder Satz zu Satz erweitert werden.

Wiederholte Absätze finden

Angenommen, unsere Datei textenthält:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

Der folgende Befehl zeigt an, welche Absätze mehrmals vorkommen:

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

Dies wird verwendet awk, um den Text in Absätze aufzuteilen (durch Leerzeilen abgegrenzt), die Zeilenumbrüche in Leerzeichen umzuwandeln und dann die Ausgabe, eine Zeile pro Absatz, zum Sortieren und eindeutigen Zählen doppelter Absätze zu übergeben.

Das Obige wurde mit GNU getestet awk. Bei anderen awkkann sich die Methode zum Definieren von Leerzeilen als Absatz- (Datensatz-) Grenzen unterscheiden.

John1024
quelle
1
Ich würde für mehrere Zeilen gleichzeitig stimmen.
Praxeolitic
1
@Praxeolitic Für Absätze aktualisiert.
John1024