Encontrar patrones entre dos archivos

Encontrar patrones entre dos archivos

File1contiene una lista de genes (representados por las letras). Cada gen ha sido descrito por la proteína que expresa (representada por las letras):

a-1
b-2
c-3

File2También contiene una lista de genes, pero cada uno de ellos se repite varias veces. Algunos de estos genes son similares al de File1:

a
a
a
b
b
c
c
c

Necesitaré encontrar todos los genes File1que son comunes en File2. Los comunes deben imprimirse en un tercer archivo (las copias múltiples también). Además de eso, el tipo de proteína que expresan los genes también debe escribirse (como en File1).

¿Cómo puedo obtener lo siguiente File3?

a-1
a-1
a-1
b-2
b-2
c-3
c-3
c-3

Respuesta1

Aquí hay una forma sencilla de hacerlo con gawk, que tiene una variable incorporada ARGIND, el índice ARGVdel archivo actual que se está procesando.

Dividimos cada línea de entrada del primer archivo -y usamos el primer campo para indexar en una matriz tableque almacena la línea completa. Para el segundo archivo (y cualquier archivo siguiente), usamos la línea completa como índice tablepara recuperar la línea deseada.

BEGIN{FS = "-"}
ARGIND==1{table[$1] = $0}
ARGIND>1{print table[$0]}

O como una sola línea:

awk 'BEGIN{FS = "-"}; ARGIND==1{table[$1] = $0}; ARGIND>1{print table[$0]}' file_1 file_2

Aquí hay otra versión que funcionará en awk tradicional. Determina si el archivo actual es el primer archivo comparando FNRel número de registro de entrada en el archivo de entrada actual con NRel número total de registros de entrada vistos hasta el momento.

awk -F'-' 'NR==FNR{table[$1] = $0}; NR>FNR{print table[$0]}' file_1 file_2

información relacionada