File1
conté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
File2
també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 File1
que 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 ARGV
do arquivo atual que está sendo processado.
Dividimos cada linha de entrada do primeiro arquivo -
e usamos o primeiro campo para indexar em um array table
que armazena a linha inteira. Para o segundo arquivo (e quaisquer arquivos seguintes), usamos a linha inteira como índice table
para 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 FNR
o número do registro de entrada no arquivo de entrada atual com NR
o 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