Identifier les blocs de texte en double dans un fichier


10

Existe-t-il un moyen pratique d'identifier les blocs de texte en double ou presque en double dans un fichier?

Je veux l'utiliser pour identifier la duplication de code. Il semble qu'il existe des programmes spécialisés avec cette capacité, mais je ne cherche pas à y participer.

J'espère qu'il existe un outil similaire à diff qui peut faire une sorte de diff "dans un fichier". Encore mieux serait un vimdiff dans un seul fichier.


Qu'est-ce qui ne vimdiffvous convient pas ici?
slm

Parce qu'il n'y a qu'un seul fichier impliqué. Je ne sais pas comment utiliser vimdiff sur des parties distinctes du même fichier.
Praxeolitic

Je vois, j'ai raté qu'il s'agissait d'un seul fichier.
slm

Réponses:


13

Si faire la comparaison ligne par ligne est acceptable, alors ce qui suit indiquera quelles lignes sont dupliquées dans le fichier textet combien de fois chacune apparaît:

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

Par exemple,

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

En utilisant les outils Unix habituels, cela pourrait être étendu, en supposant que le format de test d'entrée n'est pas trop complexe, aux comparaisons paragraphe par paragraphe ou phrase par phrase.

Recherche de paragraphes répétés

Supposons que notre fichier textcontienne:

This is a paragraph.

This is another
paragraph

This is
a paragraph.

Last sentence.

La commande suivante identifie les paragraphes qui apparaissent plusieurs fois:

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

Cela permet awkde décomposer le texte en paragraphes (délimités par des lignes vides), de convertir les sauts de ligne en espaces, puis de passer la sortie, une ligne par paragraphe, pour trier et uniq pour compter les paragraphes dupliqués.

Ce qui précède a été testé avec GNU awk. Pour les autres awk, la méthode de définition des lignes vierges comme limites de paragraphe (enregistrement) peut différer.


1
Je voterais pour plusieurs lignes à la fois.
Praxeolitic

1
@Praxeolitic Mis à jour pour les paragraphes.
John1024
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.