Veja a mesma ideia básica do awk na resposta do Archemar , implementada em Perl:
$ perl -lane '$#F>1?print"$l{$F[0]} @F[1..$#F]":($l{$F[0]}=$F[1])' file2 file1
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs654 90 2 29.26089611 4.43E-07
rs345 90 2 28.56723908 6.26E-07
rs665 104 2 28.27577506 7.24E-07
rs787 100 2 28.16226794 7.67E-07
rs435 50 2 27.92464882 8.63E-07
Explicação
-
-lane: o-ladiciona uma nova linha a cadaprintchamada e remove novas linhas finais de cada linha de entrada. O-afazperlagir comoawk: ele dividirá automaticamente cada linha de entrada na matriz@F. Então, o primeiro campo será$F[0], o segundo$F[1]etc. O-ndiz ao perl para ler seu (s) arquivo (s) de entrada linha por linha e aplicar o script dado com-ea cada um deles. -
$#F>1? ... : ...: este é um operador condicional de estilo C. O formato geral écondition ? foo : bar, o que significa "seconditionfor true, dofooe, se não for,bar. O$#Fé o número de índices da matriz na matriz@F. Como as matrizes começam em0, um valor de1significa uma matriz com dois elementos.Então, isso executará o primeiro bloco (print ..., veja abaixo) se houver mais de 2 elementos na matriz, que será só será verdade parafile1. -
($l{$F[0]}=$F[1]): isso é executado para cada linha do arquivo2, para cada linha com menos de 3 campos. Ele preenche o hash%l, cujas chaves são os primeiros campos numéricos defile2e cujos valores são os rsIDs associados. -
print"$l{$F[0]} @F[1..$#F]": imprime o rsID salvo no hash%lpara este primeiro campo ($l{$F[0]}), um espaço e o restante dos campos nessa linha ($F[1..$#F]).
Pessoalmente, provavelmente usaria a solução awk ou, na pior das hipóteses, a perl que forneci, uma vez que eles não precisam que os arquivos sejam classificados. No entanto, desde que você marcou com join , veja como fazer isso usando essa ferramenta:
$ join -o 2.2 1.2 1.3 1.4 1.5 <(sort file1) <(sort file2)
rs787 100 2 28.16226794 7.67E-07
rs665 104 2 28.27577506 7.24E-07
rs435 50 2 27.92464882 8.63E-07
rs435 50 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs435 51 2 27.92464882 8.63E-07
rs564 82 2 30.12532071 2.87E-07
rs345 90 2 28.56723908 6.26E-07
rs654 90 2 29.26089611 4.43E-07