Se suas strings não contiverem nenhuma nova linha, aqui está uma solução usando apenas ferramentas POSIX. Ele funciona colocando todos os caracteres em uma linha separada, unindo os dois arquivos e extraindo as linhas onde o primeiro arquivo (agora a primeira coluna) tinha um *
.
con_file=$(mktemp)
echo "$con" | sed -e 's/./&\
/g' >"$con_file"
prot_lines=$(echo "$prot" | sed -e 's/./&\
/g')
prot_extract=$(echo "$prot_lines" |
paste -d "$con_file" - |
sed -n 's/^* //p' |
tr -d '\n')
Outra abordagem, talvez mais direta e, sem dúvida, mais rápida, é escrever um loop no awk.
echo "$prot" | awk -v filter="$con" '{
for (i=1; i<=length; i++) {
if (substr(filter, i, 1) == "*") printf "%c", substr($0, i, 1);
}
}
END {printf "\n"}'
Ainda outra abordagem seria converter o filtro em uma lista de índices. A conversão é lenta, mas espero que este seja o método mais rápido se você tiver uma lista muito longa de proteínas para cada conjunto de índices.
indices=$(echo "$con" |
sed 's/\*\**/,&\n/g' |
awk -F , 'BEGIN {start = 1}
/\*/ {start += length($1);
printf "%d-", start;
start += length($2);
printf "%d,", start - 1}')
indices=${indices%,}
echo "$prot" | cut "$indices"