Realizar operación “minus” entre dos ficheros de texto

cómo hacer un diff simple de ficherosArreglando el otro día el estropicio provocado por la puesta en producción (antes de la fecha programada) de un sistema en el que estoy trabajando actualmente tuve la necesidad de conocer qué entradas de un fichero no se encontraban en otro.

Aunque existen soluciones gráficas (muy cómodas ellas) como Meld o comandos como diff para conocer las diferencias entre dos archivos cualquiera no tenía la solución a mi problema (por mucho que miraba los parámetros no conseguía quitar los signos < y > en diff y Meld se ve muy claro pero necesitaba guardar las diferencias en disco para poder hacer un procesamiento posterior).

Opté por cambiar el enfoque radicalmente y acabé con el comando join. Aquí os dejo la solución (y el “enunciado” del problema) por si os sirve como referencia y/o ayuda 😉

Enunciado

Imaginemos que tenemos un fichero (que hemos obtenido por cualquier medio según lo que estemos haciendo en ese momento) con todos los valores que nos interesan (p.e. los valores de una columna de alguna tabla de nuestra BD).

Sea ese fichero para nosotros valoresBD.lst y su contenido algo así como

1
2
3
4
5

Sea otro fichero, al que llamaremos valoresDisco.lst, en el que faltan algunos de los valores anteriores (deberían estar todos pero algunos se nos han “perdido”).

Sea el contenido de dicho fichero

1
3
4

Observa que en valoresDisco.lst faltan las entradas 2 y 5 😉
Encuentre un comando que le permita conocer las entradas del fichero valoresBD.lst que no existen en valoresDisco.lst

Solución

Qué bonita es la teoría de conjuntos y los operadores join, minus, intersect de SQL 😉

En Bash podemos realizar un minus entre dos conjuntos de valores (los contenidos de los ficheros) gracias al comando join (ya os estoy liando ¿no?)

Bastaría lanzar un

join -v 1 valoresBD.lst valoresDisco.lst

Donde el parámetro -v 1 nos permite indicar al comando join que no queremos que nos muestre las líneas emparejables (aquellas que existen también en valoresDisco.lst) del fichero 1 (en nuestro caso valoresBD.lst que es el que hemos puesto como primer fichero en la lista de ficheros a comparar).

Explicado de otra forma: muestrame todas las líneas del primer fichero (valoresBD.lst que tiene todos los posibles valores) que no existen en el segundo (valoresDisco.lst)

Conclusión

Alternativa al comando diff que nos permitirá conocer, desde la línea de comandos, aquellas entradas que no existen en otro fichero.

Si lo vas a usar más de una vez y no te quieres complicar la vida, siempre puedes crear un alias (yo lo llamaría minus ;)) para no tener que recordar el orden en el que van los ficheros y/o el valor que debes asignar al parámetro -v

Espero que os sea de utilidad; cualquier solución alternativa al problema planteado estaré encantado de escucharla. Se valorarán tanto la simplicidad como la facilidad de uso a la hora de poneros nota 😛

2 comentarios en “Realizar operación “minus” entre dos ficheros de texto

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s