Se você quiser buscar sua solução de perl tentada, uma maneira seria usar um hash como uma simples tabela de pesquisa, por exemplo
%table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0)
e, em seguida, use o valor de @F[2]
como chave. Então, por exemplo
perl -alne '
%table = ("AA" => 2,"AB" => 1,"BA" => 1,"BB" => 0);
print $.==1? $_ : join " ", @F[0,1], $table{@F[2]}
' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0
Na verdade, é uma maneira de fazer o caso simples que você descreveu usando tr
do perl - já que ele retorna o número de transliterações. Assim, você pode usar o valor de retorno de tr /A//
para conta o número de As:
perl -alne 'print $.==1? $_ : join " ", @F[0,1], @F[2] =~ tr/A//' file
Id_animal Id_SNP Allele
ID01 rs01 1
ID02 rs01 1
ID03 rs01 2
ID04 rs01 0
ou ainda mais simples (usando um regex para identificar a string de destino, em vez de dividir e unir)
perl -pe 's/\b[AB]{2}\b/$& =~ tr{A}{}/ge' file
Você poderia usar o mesmo truque com awk
, ou seja,
awk 'FNR>1 {$3 = gsub(/A/,"",$3)}1' file