Buscar las lineas de un fichero que contienen las lineas de otro fichero en Linux

Me ha quedado un poco enrevesado el título del artículo, pero no veo forma más fácil de expresarlo en una linea. Creo que lo más fácil va a ser dar una explicación detallada.

Tengo dos ficheros. El primero contiene un listado de IDs, con un ID por línea:

458-12-345
466-44-3-223
578-4-58-1
599-478
854-52658
955-12-32

El segundo fichero tiene un listado de IDs seguidos de la información relevante:

111-2457-1 0.2545 0.5484 0.6914 0.4222
112-4844-487 0.7475 0.4749 0.1114 0.8413
115-44-48-5 0.4464 0.8894 0.1140 0.1044
...

Los IDs del primer fichero son los que necesito, y hay unos 1,000 mientras que en el segundo fichero tengo más de 200,000 líneas. La instrucción bash que estaba utilizando era la siguiente:

cat fichero1.txt | while read line; do cat fichero2.txt | egrep "^line "; done > fichero_resultado.txt

Esta instrucción realiza la tarea correctamente, pero es muy lenta. Hay que tener en cuenta que está realizando unas 1,000 búsquedas en un fichero de 200,000 líneas que pesa casi 400 MB. Además, por alguna razón que desconozco, esta instrucción que me funciona tanto en un Fedora como en Cygwin, no consigo que me funcione en Ubuntu. Lo he probado todo y no hay manera. Tal vez sea por alguna actualización o por estar corriendo en una máquina virtual, pero por alguna razón no va.

Así que preguntando en StackOverflow, me han dado una solución:

awk 'FNR==NR{i[$1]=1;next} i[$1]{print}' fichero1.txt fichero2.txt > fichero_resultado.txt

No he usado awk antes, así que ahora mismo no se que hace, pero funciona, y es mucho más rápido (tarda apenas unos segundos).


Publicado por Carlos Llongo el

Archivado en linux