Encontrando padrões entre dois arquivos

Encontrando padrões entre dois arquivos

File1contém uma lista de genes (representados pelas letras). Cada gene foi descrito pela proteína que expressa (representada pelas letras):

a-1
b-2
c-3

File2também contém uma lista de genes, mas cada um deles é repetido várias vezes. Alguns desses genes são semelhantes aos de File1:

a
a
a
b
b
c
c
c

Precisarei encontrar todos os genes File1que são comuns em File2. Os comuns precisam ser impressos em um terceiro arquivo (as múltiplas cópias também). Junto com isso, o tipo de proteína que os genes expressam também precisa ser escrito (assim como em File1).

Como posso obter o seguinte File3?

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

Responder1

Aqui está uma maneira simples de fazer isso com o gawk, que possui uma variável integrada ARGIND, o índice ARGVdo arquivo atual que está sendo processado.

Dividimos cada linha de entrada do primeiro arquivo -e usamos o primeiro campo para indexar em um array tableque armazena a linha inteira. Para o segundo arquivo (e quaisquer arquivos seguintes), usamos a linha inteira como índice tablepara recuperar a linha desejada.

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

Ou como uma linha:

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

Aqui está outra versão que funcionará no awk tradicional. Ele determina se o arquivo atual é o primeiro comparando FNRo número do registro de entrada no arquivo de entrada atual com NRo número total de registros de entrada vistos até agora.

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

informação relacionada