perl -ale '
$h{$F[0]}=$F[1],next if @ARGV;
my $k;
print s/\H+/$k++ ? $h{$&} : $&/reg;
' file1 file2
° Lendo o primeiro arquivo, @ARGV
contém o segundo argumento e, portanto, retorna verdadeiro.
° Preencher um hash %h
com chaves como nomes de genes e os valores correspondentes do segundo campo, para cada linha de arquivo1.
° para o segundo arquivo, @ARGV não conterá nada e, portanto, retornará um falso. As duas últimas linhas de código serão executadas para cada linha de arquivo2.
° Inicialize a variável de contagem toda vez que uma linha de arquivo2 for lida. Em seguida, o \H+
deve corresponder a uma execução de caracteres não horizontais em branco, ou seja, um campo. E no dia 2 em diante, os subs do nome do gene = > o número do gene é acionado.
O editor sed com extensões do Gnu também pode fazer isso:
sed -Ee '
# store file1 in hold
/^C/!{H;1h;d;}
# place a traveling marker \n\n at $2
s/$/ /
G
s/(\S+\s+)/&\n\n/
# effect gene name => gene number
:a
s/\n\n(\S+)[ ]+((.*\n)?\s+([0-9]+))/ \n\n/
ta
# take away marker and hold portion
s/\n\n.*//
' file1 file2