Com a ajuda de esta resposta
awk 'FNR==NR && FNR>1 {a[$2] = $5; next}
FNR > 1 && ($2 in a) && $3 == "ALL" {
print $1 " " $2 " " a[$2] " " $9
}' file2 file1
Para obter o cabeçalho também, basta adicionar isso ao início do script:
BEGIN{print "CHR SNP MAF P"}
Explicação:
Primeiro, quando dois arquivos são passados para o awk, eles são processados um após o outro. Há duas variáveis importantes aqui: NR
é o número da linha desde o início do comando awk
e FNR
é o número da linha desde o início do arquivo atual. Ou seja, quando o primeiro arquivo é processado (aqui file2), NR
e FNR
têm o mesmo valor, que é o valor da linha atualmente processada. Mas quando o awk passa para o segundo arquivo, FNR
é redefinido para 1, então NR
e FNR
não são mais os mesmos. Para que o teste FNR==NR
seja um truque para saber se o arquivo processado é o primeiro ou não.
Então, vamos ver o código. A condição FNR==NR && FNR>1
testa se estamos processando o primeiro arquivo e não a primeira linha. Se for o caso, armazenamos o valor da quinta coluna ( MAF
) em uma matriz indexada pela segunda ( SNP
) e, em seguida, a instrução next
diz para passar para a linha a seguir.
Quando o awk processa o segundo arquivo (que é file1), o primeiro teste é falso, de forma que o awk tenta o segundo teste: FNR > 1 && ($2 in a) && $3 == "ALL"
, ou seja: não a primeira linha do arquivo + segundo valor da coluna ( SNP
) existe na tabela a
+ terceiro valor da coluna ( TEST
) é "ALL"
. Se for o caso, ele imprime a coluna 1 ( CHR
) e dois ( SNP
), obtém o valor MAF
da matriz com a[$2]
e, em seguida, imprime a coluna nove ( P
). / p>
Adicionar uma instrução BEGIN{...}
no início adiciona um comando que é executado somente antes da primeira linha ser processada.