¿Hay alguna herramienta que pueda obtener líneas que contiene el archivo A, pero no el archivo B? Podría hacer un pequeño script simple con, por ejemplo, Perl, pero si ya existe algo así, ahorraré tiempo a partir de ahora.
Respuesta aceptada:
Sí. El grep
estándar La herramienta para buscar cadenas de texto en archivos 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 archivoB como un patrón (-f fileB
) y tratándolo como una cadena simple para que coincida (no como una expresión regular regular) (-F
). Obligas a que la coincidencia ocurra en toda la línea (-x
) e imprima solo las líneas que no coincidan (-v
). Por lo tanto, está imprimiendo las líneas del archivo A que no contienen los mismos datos que ninguna línea del archivo B.
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 usar 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 convirtiera el archivo A al archivo B. (Tenga en cuenta este comando también elimina el formato de diferencia después de obtener las líneas correctas).
diff -U $(wc -l < fileA) fileA fileB | sed -n 's/^-//p' > fileC