Uma solução perl
:
$ perl -anle '
print "$_ position(cs)" and next if /^#/;
printf "%s",$_;
for $pos_ss (split ",",$F[5]) {
$char = substr($F[3],$pos_ss-1,1);
@cs = split //,$F[1];
@cs_idx = grep {$cs[$_] eq $char} 0..$#cs;
push @res,++$cs_idx[$pos_ss-1];
}
printf "%14s\n", join ",",@res;
@res=();
' file
#name complete(cs) len(cs) simple(ss) len(ss) position(ss) position(cs)
NAME1 A0AAA000AAA00A 14 AAAAAAAA 8 4,6 5,10
NAME2 AAAA0AA00000A 13 AAAAAAA 7 7 13
Como funciona
- As primeiras duas linhas imprimem a entrada original.
-
for $pos_ss (split ",",$F[5])
: dividimos o campo 6, obtemos cada índice desejado em string simples. -
$char = substr($F[3],$pos_ss-1,1)
: obtém o caractere no índice fornecido em uma string simples. -
@cs = split //,$F[1]
: obtemos todos os caracteres em sequência completa, salve-os em uma matriz. -
@cs_idx = grep {$cs[$_] eq $char} 0..$#cs
: obtém todos os índices na matriz@cs
, cujo valor é igual a$char
. -
push @res,++$cs_idx[$pos_ss-1]
: salve o índice que desejamos para o array@res
. - As duas últimas linhas apenas imprimem o resultado que obtivemos e esvaziam
@res
array para o próximo uso.