Enquanto estou verificando os resultados da minha implementação do biostar para pesquisar primos em um arquivo fasta, vi um resultado estranho. Eu originalmente um arquivo de 70 colunas e o converti em um arquivo que possui 6077828 caracteres em uma única linha.
Quando eu usei o comando grep
grep -o -P -b -n CAATCGCCGT fasta.txt
Ele exibe duas correspondências que não são exibidas na minha implementação do Biostar.
3:3206721:CAATCGCCGT
3:4140348:CAATCGCCGT
Procurei a cartilha com Kate no arquivo original e não encontrei. É possível que a cartilha se espalhe em duas linhas devido à divisão de 70 colunas do texto.
Então eu os converti em números de linha e coluna com div e mod
- 3206572 representa a linha 45808 e a coluna 12
- 4140199 representa a linha 59145 e a coluna 49
A cartilha, no entanto, não estava lá.
Existe um limite para a linha máxima que o grep pode processar? Em caso afirmativo, quando o limite excede, os resultados são confiáveis até o tamanho limite?
No geral
A especificação POSIX de
grep
afirma queIsso significa
grep
que deve lidar com arquivos de texto de forma confiável ( "deverá" significa "comportamento obrigatório" ). Arquivos que não são arquivos de texto podem ou não ser manipulados de forma confiável, o comportamento não é especificado.Um "arquivo de texto" aqui significa [ênfase minha]:
{LINE_MAX}
é explicado aqui :Tudo isso significa que uma implementação de
grep
pode manipular incorretamente linhas mais longas do que{LINE_MAX}
para o sistema fornecido e ainda pode ser chamada de "portátil".{LINE_MAX}
pode ser tão baixo quanto 2048.Tenha em mente que não é como se alguém tivesse criado a especificação e os mantenedores de diferentes implementações
grep
lutassem para se conformar. É o contrário: as principais implementações existentes foram examinadas, o conjunto comum de recursos encontrado e documentado. Pode ser algum necessário para recuperar um pouco. Alguns podem ser muito mais poderosos; e alguns podem ter sido considerados não importantes desde o início, menos capazes por qualquer motivo, com motivos para não alcançá-los.De uma forma ou de outra, você pode esperar que seja
grep
fornecido com um sistema operacional orientado para POSIX (como Linux) e especialmente com um sistema operacional certificado para POSIX (como macOS) para lidar de forma confiável com linhas de até 2048 bytes de comprimento que não contêm caracteres NUL. Segrep
puder lidar com linhas mais longas, trate-o como um bônus.A resposta geral para "existe um limite para o comprimento da linha?" é: sim, pode haver, depende da implementação; mas se houver um limite, deve ser de pelo menos 2048 bytes. O comportamento para linhas mais longas não é especificado.
Em particular
Você marcou o Ubuntu . Ubuntu vem com GNU
grep
. GNUgrep
afirma isso :