Pregunta:
¿Existe alguna herramienta que pueda obtener las líneas que contiene el archivo A, pero el archivo B no? Podría hacer un pequeño script simple con, por ejemplo, perl, pero si algo así ya existe, ahorraré mi tiempo de ahora en adelante.
Respuesta:
Si. La herramienta grep
estándar para buscar archivos de cadenas de texto se puede utilizar para restar todas las líneas de un archivo de otro.
grep -F -x -v -f fileB fileA
Esto funciona usando cada línea en el archivo B como un patrón ( -f fileB
) y tratándola como una cadena simple para que coincida (no como una expresión regular) ( -F
). Obliga a que la coincidencia se produzca en toda la línea ( -x
) e imprime solo las líneas que no coinciden ( -v
). Por lo tanto, está imprimiendo las líneas del archivoA que no contienen los mismos datos que ninguna línea del archivoB.
La desventaja de esta solución es que no tiene en cuenta el orden de las líneas y, si su entrada tiene líneas duplicadas en diferentes lugares, es posible que no obtenga lo que espera. La solución a eso es utilizar una herramienta de comparación real como diff
. Puede hacer esto creando un archivo diff con el valor de contexto al 100% de las líneas en el archivo, luego analizándolo solo para las líneas que se eliminarían si se convierte el archivo A en el archivo B. (Tenga en cuenta que este comando también elimina el archivo diff formateado después de obtener las líneas correctas).
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC