Você poderia fazer isso com awk
, cujo match()
que define a variável RSTART
e RLENGTH
é bastante útil para isso:
<mySequence.fasta awk -v C=N '{
i=0
while (match($0, C "+")) {
printf "Position %d %s %d\n", i+RSTART, C, RLENGTH
i += RSTART+RLENGTH-1
$0 = substr($0, RSTART+RLENGTH)
}}'
Ou com perl
usando as matrizes @-
e @+
que registram o início e o fim das correspondências:
perl -ne 'printf "Position %d N %d\n", $-[0]+1, $+[0]-$-[0] while /N+/g'
Outra abordagem um pouco mais rápida (pelo menos com a minha versão de perl
) perl
usando o operador ( experimental ) (?{...})
regexp:
perl -ne '0 while /N(?{$s=pos})N*(?{printf "Position %d N %s\n", $s, pos()-$s+1})/g'