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