2009-10-14 11 views
37

Necesito trabajar con archivos grandes y debo encontrar diferencias entre dos. Y no necesito los diferentes bits, sino la cantidad de diferencias.¿Cómo contar las diferencias entre dos archivos en Linux?

para encontrar el número de filas diferentes se me ocurren

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

y funciona, pero hay una mejor manera de hacerlo?

Y cómo contar el número exacto de diferencias (con herramientas estándar como bash, diff, awk, sed alguna versión anterior de perl)?

Respuesta

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

Eso menos 2 para los dos nombres de archivo en la parte superior de la lista diff. El formato unificado es probablemente un poco más rápido que el formato lado a lado.

+5

esto no funciona, como defino "trabajar" http: // pastie. org/pastes/3179433/text Hay solo un personaje en cada archivo, ¿con qué se relaciona el número "4"? –

+0

Esto funciona. Para su ejemplo, tiene cuatro líneas: las dos primeras son el nombre de cada archivo (como se explica en la respuesta), y las otras dos son las dos diferencias, una línea con 'a' eliminada y 1 línea con 'b' agregada. –

+4

Depende de cómo cuente las diferencias. En este ejemplo [pastie.org/5553254](http://pastie.org/5553254), considero que hay 2 líneas que difieren, es decir, estoy de acuerdo con sequoia mcdowell. También es inconveniente tener que restar 2 del resultado (debido a la impresión de los 2 archivos modificados). Por lo tanto, creo que la respuesta de Josh es la correcta. Se puede acortar ligeramente usando la opción -c (count) en grep, en lugar de piping-w, como este: 'diff -U 0 file1 file2 | grep -c^@ ' –

6

Si usa Linux/Unix, ¿qué pasa con comm -1 file1 file2 para imprimir líneas en el archivo1 que no están en el archivo2, comm -1 file1 file2 | wc -l para contarlas, y de manera similar para comm -2 ...?

+0

Como sureshw señala en otra respuesta, 'comm' espera sus argumentos para ser * archivos ordenados *. Por lo tanto, esta sugerencia solo se puede confiar en casos especiales.(Creo que sería fácil escribir tu propia versión de 'comm' usando awk que también funcionaba para entradas no ordenadas, pero dudas de que esto satisfaga el espíritu de la pregunta original) – dubiousjim

40

Si desea contar el número de líneas que son diferentes este uso:

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

no contesta de John doble cuentan las diferentes líneas?

+0

Sí, cuenta doble. Ver mi comentario sobre la respuesta aceptada. El comando en esta respuesta es correcto. –

+2

Esto parece potencialmente contarme dos líneas también, tanto en MacOSX como en Ubuntu. Los lotes de líneas contiguas se pueden agrupar en un solo bloque, y depende de su tarea en cuanto a si debe o no ser una diferencia o varias. – khedron

+0

¡No olvide la salida de color significa que las líneas comienzan con una secuencia de escape! Tuve que usar hexdump para descubrirlo. –

4

Puesto que cada línea de salida que difiere comienza con < o > carácter, sugeriría esto:

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

utilizando sólo \< o \> en la línea de script que puede contar diferencias sólo en uno de los archivos.

+0

Este doble cuenta las líneas como "<" and ">" puede imprimirse para la misma línea . –

0

Si se trata de archivos con contenido análogo que deberían ordenarse de la misma línea por línea (como archivos CSV que describen cosas similares) y usted, por ejemplo, 2 que desee encontrar diferencias en los siguientes archivos:

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

podría implementar en Python como esto:

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 
Cuestiones relacionadas