2011-12-16 17 views
17

Estoy familiarizado con herramientas como tkDiff y WinMerge y sé cómo ver la diferencia entre dos archivos.Forma de generar diferencias entre dos archivos (preferiblemente usando la línea de comando)

Lo que quiero hacer es generar un informe de elementos en un archivo que no están presentes en otro.

Por ejemplo:

Fichero1 contiene:

apple 
cool 
dude 
flan 

archivo2 contiene:

apple 
ball 
cool 
dude 
elephant 

quiero producir un informe que contenga:

ball 
elephant 

O, mejor sin embargo, un informe l Ike esto:

+ball 
+elephant 
-flan 

¿Alguien sabe de una herramienta que puede hacer esto? Preferiblemente con opciones de línea de comando.

La función de informe en WinMerge no está muy lejos de lo que me gustaría, pero no hay una opción de línea de comandos para hacer esto (hasta donde yo sé).

Gracias de antemano.

Respuesta

20

Probablemente quiera el Unix comm utility. Windows versions están incluidos en GnuWin32

NOMBRE

comm - compare two sorted files line by line 

SINOPSIS

comm [OPTION]... FILE1 FILE2 

DESCRIPCIÓN

Compare sorted files FILE1 and FILE2 line by line. 

    With no options, produce three-column output. Column one contains 
    lines unique to FILE1, column two contains lines unique to FILE2, and 
    column three contains lines common to both files. 

    -1  suppress lines unique to FILE1 

    -2  suppress lines unique to FILE2 

    -3  suppress lines that appear in both files 
+0

Muy bonito. Gracias por esto. ¡Todo el GnuWin32 es algo de lo que no estaba enterado y está claramente completo de ORO! Al usar una combinación de -1 y -3, pude obtener lo que quería. Es una lástima que no haya + y, aunque creo que no debería ser demasiado codicioso. –

+1

¡Un poco de trabajo con sed (también en utils) debería permitirle agregar el +/- –

+1

NICE! Tenía que hacer una diferencia entre dos conjuntos de datos, y comparar 1,1 millones de filas frente a 8 millones de filas llevaría demasiado tiempo. Me deshice de .CSV y usé cygwin: comm -2 -3 file1.csv file2.csv> out.csv ¡Se ejecutó en 13 segundos! –

29

Esto podría funcionar para usted (esta GNU):

diff -u file1 file2 | sed -n '1,2d;/^[-+]/p' 
+ball 
-flan 
+elephant 
+0

Excelente.Una mejor respuesta, ya que funciona en archivos sin clasificar. La adición 'sed' de +/- es un toque agradable (requerido por la pregunta original). –

-4

para comparar los datos con símbolo del sistema puede utilizar

COMP/a/l D: \ Carpeta1 \ datos.txt D: \ Carpeta2 \ datos.txt

Aquí hay otros opciones a compare files and folders with command prompt.

+1

No veo cómo esta respuesta es relevante para la pregunta. – manWe

+0

No recibí nada útil de él: "Los archivos son de diferentes tamaños". El resultado que obtengo de [FC] (http://ss64.com/nt/fc.html) es más útil. – ofthelit

Cuestiones relacionadas