File1
contiene 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
File2
Tambié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 File1
que 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 ARGV
del 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 table
que almacena la línea completa. Para el segundo archivo (y cualquier archivo siguiente), usamos la línea completa como índice table
para 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 FNR
el número de registro de entrada en el archivo de entrada actual con NR
el 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