$ awk '{ split($0, a, "[^CTct]+"); m=0
for (i in a) {
len=length(a[i])
if (len > m) m=len
}
print $0, m }' file
CACCGTTGCCAAACAATG 2
TTAGAAGCCTGTCAGCCT 3
CATTGCTCTCAGACCCAC 5
GATGTACGTCACATTAGA 2
ACACGGAATCTGCTTTTT 6
CAGAATTCCCAAAGATGG 5
Este programa awk
divide cada linha em execuções de qualquer coisa que não seja maiúscula ou minúscula C
ou T
. Em seguida, ele faz um loop nos bits que resultam na divisão, encontrando o mais longo. Em seguida, imprime a linha original junto com o comprimento máximo encontrado.
Desde que a Roman analisou os horários de várias soluções, veja uma solução mais rápida:
awk -F "[^CTct]+" '
m = 0
for (i = 1; i <= NF; ++i) {
len = length($i)
if (len > m) m = len
}
print m' file | paste file -
É mais rápido, pois só divide as linhas uma vez. O primeiro código também tenta dividir as linhas de entrada nos espaços em branco.
O sincronismo usando mawk
mostra 0.79s em 500.000 linhas. A primeira solução usa 1.69s nos mesmos dados, mostrando que é provavelmente a operação dividida que leva mais tempo.