Busque las líneas de un archivo que no aparecen (ni siquiera parcialmente) en otro archivo.
Necesito un comando de Unix para encontrar líneas del archivo 1 que no aparezcan en absoluto en el archivo 2.
Por ejemplo –
Archivo 1:
aaa
bbb
Archivo 2:
aaaccc
bb
Salida esperada:
bbb
(“aaa” del archivo 1 aparece en el archivo 2, como parte de una cadena más larga “aaaccc”).
No puedo usar “comm” ya que solo funciona en líneas completas. En este caso, también estoy buscando excluir líneas en el archivo 2 que contengan líneas en el archivo 1 como parte de cadenas más grandes, como se explica anteriormente.
Tenga en cuenta que preferiría una forma rápida si existe, ya que mis archivos son MUY grandes.
davy.ai
Un posible comando de shell de Unix para lograr esto es usar
grep
y la opción-v
(invertir coincidencia):Explicación:
grep
: buscar en uno o varios archivos líneas que coincidan con un patrón-v
: invertir la coincidencia, mostrar líneas que no contengan el patrón-f archivo2
: obtener el patrón dearchivo2
Este comando lee
archivo1
e imprime todas las líneas que no aparecen enarchivo2
, incluso como parte de cadenas más grandes. Ten en cuenta que esto supone que las líneas enarchivo1
son completas y no contienen caracteres especiales de expresión regular. Si este no es el caso, es posible que debas escaparlos antes de ejecutar el comando.En cuanto a la velocidad,
grep
es generalmente muy rápido y eficiente, especialmente para patrones simples y archivos grandes. Sin embargo, si tus archivos son extremadamente grandes o lentos de leer desde el disco, es posible que debas considerar soluciones paralelas o de streaming, o utilizar herramientas especializadas comoawk
osed
.