Mientras se lee el bucle con grep

Mientras se lee el bucle con grep

Tengo un archivo csv con muchas líneas y necesito encontrar algunas coincidencias y guardarlo en un archivo. Mis datos son así:

Archivo 1

qwerty
asdfgh
zxcvbn
qwerty
aassdd
zzxxcc
yyuuii
tttttt

Necesito coincidir:

Archivo 2

qwert
tttttt
aassdd.

Como mi archivo es grande y mi lista de coincidencias es larga, estoy haciendo esto:

while read n ; do grep $n File_1.csv >> results.csv ; done < File_2.csv

No puedo obtener el resultado que quería.

Respuesta1

No es necesario realizar un bucle; la -fopción toma un archivo con los patrones a buscar:

grep -Ff File_2.csv File_1.csv > results.csv

También agregué la -Fopción para que los términos de búsqueda se traten literalmente, no como expresiones regulares.

Respuesta2

Si cada archivo no tiene duplicados, puede hacer lo siguiente:

# In file_1 and file_2
sort file_1 file_2 | uniq -d
# In file_1 or file_2 but not both
sort file_1 file_2 | uniq -u
# In file_1 and not file_2
sort file_1 file_2 | uniq -d | sort - file_1 | uniq -u
# In file_2 and not file_1
sort file_1 file_2 | uniq -d | sort - file_2 | uniq -u

Respuesta3

La greputilidad puede leer patrones de un archivo y compararlos con el contenido de otro archivo. No se requiere ningún bucle en el shell.

$ grep -f patterns file

Usando los dos archivos que tiene en su pregunta (el archivo 1 es filemientras que el archivo 2 es patterns), esto produce

qwerty 
qwerty 
tttttt 

Para hacer coincidir los patrones de patternscadenas fijas (no expresiones regulares), agregue -F:

$ grep -F -f patterns file

Para el ejemplo dado, esto produce el mismo resultado que sin -F.

Para forzar la coincidencia entre líneas completas, agregue -x:

$ grep -x -F -f patterns file
tttttt   

Como qwertyno coincide qwertcompletamente, esas líneas no se devuelven.

información relacionada