Estoy buscando un comando o script para hacer lo siguiente, dado:
file1.txt:
abcd
efgh
ijkl
mnop
file2.txt:
123abcd123
123efgh123
123mnop123
Quiero un comando que haga algo como esto:
ungrep file1.txt file2.txt
y devuelve lo siguiente:
ijkl
En otras palabras, me está dando las líneas en file1.txt que no devolverán ningún resultado en un grep de file2.txt. Sé que puedo hacer esto iterando a través de file1.txt, grepping file2.txt para cada línea y almacenando el resultado, y generando cualquier línea donde el resultado esté vacío, pero esperaba una forma más eficiente de hacerlo.
sort file1.txt <(grep -of file1.txt file2.txt) | uniq -u
pero, como su solución, esto solo funciona cuando el archivo de patrones no contiene metacaracteres regex.grep -oFf file1.txt file2.txt | sort file1.txt - | uniq -u
Podrías hacerlo con
awk
:Al usar
index
, buscamos subcadenas en lugar de hacer coincidir expresiones regulares.Como eliminamos la palabra de la matriz tan pronto como encontramos una coincidencia, evitamos búsquedas innecesarias.
fuente
w[$0]
tenga el efecto secundario de agregar la clave a la matriz.if (a[$1])
lugar de,if ($1 in a)
por ejemplo. Es el caso de cada unoawk
incluyendo el originalawk
ynawk
, pero mirando el estándar de ayer, no pude encontrarlo especificado.file1
no sea enorme (por algún valor de enorme), preferiría esta solución, ya que no requiere ningún tipo de clasificaciónfile2
y se espera que sea mucho más eficiente.