10 votes

Y a-t-il un outil pour mesurer le pourcentage de différence de fichier ?

Je cherche à comparer deux fichiers texte. Normalement, je peux simplement utiliser diff pour comparer les deux fichiers afin de voir les différences. C'est super, sauf que je suis plus préoccupé par le pourcentage de différence entre les deux fichiers.

Par exemple:

Fichier A:
    banane
    TESTING

Fichier B:
    TESTING

Dans ce cas, le résultat serait une différence de 50%. J'ai jeté un coup d'œil à wdiff, et ça fonctionne principalement, à l'exception du fait qu'il examine les éléments mot par mot (en fait, je peux obtenir le résultat ci-dessus en faisant wdiff -s filea fileb).

Existe-t-il un outil pour fournir la différence de pourcentage de fichiers au niveau caractère/byte?

8voto

stharward Points 211

Faire une comparaison caractère par caractère de deux fichiers textes revient en fait à calculer une distance de Levenshtein. Il n'existe pas de programme autonome courant sous Linux qui effectue ce calcul, mais il existe des fonctions de bibliothèque (je sais que PHP en a une) et de nombreux codes d'exemple en ligne pour ce calcul.

Un autre petit inconvénient est que la distance de Levenshtein est strictement le nombre de modifications entre deux chaînes, donc si vous recherchez un pourcentage, vous devrez normaliser la distance calculée. Diviser par la moyenne des longueurs des deux chaînes (tailles des fichiers texte) est une normalisation largement utilisée.

4voto

Chris Nava Points 7157

Essayez de rediriger la sortie de la commande diff vers la commande wc. Il existe plusieurs options mais -l vous donnera probablement un décompte décent du nombre de lignes modifiées. Comme la commande diff affiche les lignes avant et après avec un certain formatage, vous devrez peut-être diviser le résultat par ce facteur, puis le placer sur le résultat de la longueur totale du fichier en lignes. wc -l

4voto

Eduard Florinescu Points 2616

J'ai eu un problème similaire avec deux ensembles de fichiers transcrits. J'ai utilisé la distance de Levenshtein comme suggéré dans la réponse la plus votée, mais j'ai trouvé qu'utiliser Python était une meilleure option.

pip install python-Levenshtein

et le code sera celui-ci :

import sys

from Levenshtein import *

txt1 = open(sys.argv[1]).read()
txt2 = open(sys.argv[2]).read()

print("distance:", distance(txt1, txt2))

utilisez :

python distance.py fichier1 fichier2

0voto

marcioggs Points 161

Je suggère sdiff:

 sdiff -B -b -s ~/temp/code_old.cpp ~/temp/code_new.cpp | wc
      47     366    3685
      ^^ ~~~ nombre de lignes modifiées

ensuite:

 cat ~/temp/code_old.cpp | wc
     131     466    4388
     ^^^ ~~~ nombre de lignes avant le changement

ensuite:

 bc -l <<< "47./131.*100."

35.87786259541984732800

donne le résultat - le code a été modifié à 35%. (en comptant les lignes).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X