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 -f
opción toma un archivo con los patrones a buscar:
grep -Ff File_2.csv File_1.csv > results.csv
También agregué la -F
opció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 grep
utilidad 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 file
mientras que el archivo 2 es patterns
), esto produce
qwerty
qwerty
tttttt
Para hacer coincidir los patrones de patterns
cadenas 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 qwerty
no coincide qwert
completamente, esas líneas no se devuelven.