Se você já conhece o Perl, por que não usá-lo? Perl se destaca no one-liners:
$ perl -F'' -lane 'for($i=0;$i<=$#F-20;$i++){print @F[$i..$i+20]}' file
CCGGTCTCTTCCGGTTCTGTC
CGGTCTCTTCCGGTTCTGTCT
GGTCTCTTCCGGTTCTGTCTT
GTCTCTTCCGGTTCTGTCTTT
TCTCTTCCGGTTCTGTCTTTT
CTCTTCCGGTTCTGTCTTTTC
TCTTCCGGTTCTGTCTTTTCG
CTTCCGGTTCTGTCTTTTCGC
TTCCGGTTCTGTCTTTTCGCT
TCCGGTTCTGTCTTTTCGCTG
CCGGTTCTGTCTTTTCGCTGG
Explicação
A opção -a
faz com que perl
aja como awk
, dividindo suas linhas de entrada no valor dado por -F
e salvando-as em @F
. Como -F
aqui está vazio, o resultado é que os elementos da matriz @F
são os caracteres da linha. A opção -l
ativa chomp
automaticamente e também adiciona \n
a cada chamada print
.
O script em si simplesmente incrementa um contador ( $i
) de 0 até o comprimento da matriz ( $#F
) e o faz contanto que $i
seja menor ou igual ao comprimento da matriz menos 20, para só obtém sequências do tamanho certo. Em seguida, ele imprime a fatia da matriz do valor atual de $i
até $i+20
.
Se você executar isso com -MO=Deparse
para analisar o que está fazendo, será possível ver se ele é executado:
$ perl -MO=Deparse -F'' -lane 'for($i=0;$i<=$#F-20;$i++){print @F[$i..$i+20]}' file
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
our @F = split(//, $_, 0);
for ($i = 0; $i <= $#F - 20; ++$i) {
print @F[$i .. $i + 20];
}
}
-e syntax OK