Eu tenho um arquivo de texto de 250 MB, tudo em uma linha.
Neste arquivo, quero substituir a
caracteres por b
caracteres:
sed -e "s/a/b/g" < one-line-250-mb.txt
Falha com:
sed: couldn't re-allocate memory
Parece-me que esse tipo de tarefa pode ser executada em linha sem alocar muita memória.
Existe uma ferramenta melhor para o trabalho ou uma maneira melhor de usar sed
?
GNU sed versão 4.2.1
Ubuntu 12.04.2 LTS
1 GB RAM
text-processing
sed
performance
large-files
out-of-memory
Nicolas Raoul
fonte
fonte
Respostas:
Sim, use em
tr
vez disso:sed
negocia em linhas, de modo que uma linha enorme causará problemas. Espero que esteja declarando uma variável internamente para manter a linha e sua entrada excede o tamanho máximo alocado para essa variável.tr
por outro lado, lida com caracteres e deve ser capaz de lidar com linhas arbitrariamente longas corretamente.fonte
sed -e "s/a/z/g" b.txt > c.txt
sem problemas. Usando sed (GNU sed) 4.2.2.sed
versão, acho que depende da implementação ou do hardware.sed
.As versões históricas do sed e do awk tinham problemas de memória, que foram corrigidos principalmente nas versões mais recentes, mas uma das ocorrências clássicas desse problema atingiu Larry Wall com bastante dificuldade. sua resposta foi escrever uma nova linguagem de programação - sem limites de memória além do hardware. Ele chamou isso de perl. seu problema específico pode ser resolvido de maneira mais simples, mas a regra geral que uso é quando o sed não usa perl.
Editar: a pedido, um exemplo:
ou para menos uso de memória:
fonte
sed
, no entanto. : \