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 -upero, 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 -uPodrí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 unoawkincluyendo el originalawkynawk, pero mirando el estándar de ayer, no pude encontrarlo especificado.file1no sea enorme (por algún valor de enorme), preferiría esta solución, ya que no requiere ningún tipo de clasificaciónfile2y se espera que sea mucho más eficiente.