web-dev-qa-db-fra.com

Comment compter les différences entre deux fichiers sur Linux?

Je dois travailler avec de gros fichiers et trouver des différences entre les deux. Et je n'ai pas besoin des différents bits, mais du nombre de différences.

Pour trouver le nombre de rangées différentes que je viens avec 

diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l

Et cela fonctionne, mais y a-t-il une meilleure façon de le faire?

Et comment compter le nombre exact de différences (avec des outils standard comme bash, diff, awk, une ancienne version de Perl)?

45
Zsolt Botykai
diff -U 0 file1 file2 | grep -v ^@ | wc -l

Cela moins 2 pour les deux noms de fichier en haut de la liste diff. Le format unifié est probablement un peu plus rapide que le format côte à côte.

41
John Kugelman

Si vous voulez compter le nombre de lignes différentes, utilisez ceci:

diff -U 0 file1 file2 | grep ^@ | wc -l

La réponse de John ne compte-t-elle pas en double les différentes lignes?

44
Josh

Si vous utilisez Linux/Unix, qu'en est-il de comm -1 file1 file2 pour imprimer les lignes du fichier1 qui ne sont pas dans le fichier2, du comm -1 file1 file2 | wc -l pour les compter et de la même façon pour le comm -2 ...

6
dubiousjim

Puisque chaque ligne de sortie qui diffère commence par < ou >, je suggérerais ceci:

diff file1 file2 | grep ^[\>\<] | wc -l

En utilisant uniquement \< ou \> dans la ligne de script, vous ne pouvez compter les différences que dans l'un des fichiers.

4
Michal Nemec

Je crois que la bonne solution est dans cette réponse , c'est-à-dire:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
1
tsusanka

Si vous traitez avec des fichiers ayant un contenu analogue, vous devez trier la même ligne pour ligne (comme les fichiers CSV décrivant des choses similaires) et vous le feriez par exemple. voulez trouver 2 différences dans les fichiers suivants:

File a:    File b:
min,max    min,max
1,5        2,5
3,4        3,4
-2,10      -1,1

vous pouvez l'implémenter en Python comme ceci:

different_lines = 0
with open(file1) as a, open(file2) as b:
    for line in a:
        other_line = b.readline()
        if line != other_line:
            different_lines += 1
0
Daniel Lee