Eu tenho um arquivo de texto de 25 GB que precisa de uma string substituída em apenas algumas linhas. Posso usar com sed
sucesso, mas leva muito tempo para ser executado.
sed -i 's|old text|new text|g' gigantic_file.sql
Existe uma maneira mais rápida de fazer isso?
sed
replace
large-files
eisaacson
fonte
fonte
Respostas:
Podes tentar:
Desta referência :
Aqui está uma comparação sobre um arquivo 10G. Antes:
Depois de:
fonte
sed
está incorreto. Eu editei este post ontem para corrigir o últimosed
comando que deveria sertime sed -i '/original/ s//ketan/g' wiki10gb
e nãotime sed -i '/ketan/ s//original/g' wiki10gb
. Estou revertendo minha edição hoje porque 1. os horários não correspondem mais ao comando e 2. Fiz o mesmo teste com o GNU sed em um arquivo de 3 GB ou mais e não observo nenhuma diferença entre as duassed
alternativas. Suspeito que a diferença nos tempos se deva ao erro de ortografia.time
resultados pessoalmente, mas, no geral, não houve diferença no tempo.A resposta curta é "Não" - seu fator limitante nesse tipo de operação é a E / S do disco. Não há como transmitir 25 GB de disco mais rapidamente. Você pode obter uma pequena melhoria se não editar o local e gravar o resultado da
sed
unidade em uma unidade separada (se houver uma disponível) - porque dessa maneira você pode ler de uma, enquanto escreve para outra e há um pouco menos contenção como resultado.Você pode acelerar um pouco não usando o mecanismo de expressão regular para cada linha - por exemplo, usando perl (tenho certeza de que você pode fazer isso com
sed
mas não conheço a sintaxe) - isso começará a partir de linha 10.000 em diante.E se houver algum tipo de complicação nos ER (metacaracteres), minimizá-los melhorará um pouco a eficiência do mecanismo regex.
fonte
sed -i '10000,$ s/old_text/new_text/g'
sed
compara - presumo um pouco mais rápido, mas não muito por causa do tamanho do arquivo.sed
emperl
, mas este último também permite que você escreva mais detalhado roteiros também.Se os textos novos e antigos tiverem o mesmo comprimento, você poderá procurar no arquivo e gravar apenas os bytes alterados, em vez de copiar o arquivo inteiro. Caso contrário, você ficará preso à movimentação de muitos dados.
Nota: isso é complicado e envolve escrever código personalizado.
Consulte a página de manual do fseek, se você estiver trabalhando em C ou C ++, ou seus wrappers de idiomas favoritos para as chamadas de sistema de busca e gravação.
Se você insistir em usar apenas a linha de comando e conseguir os desvios de bytes do texto, poderá escrever o texto de substituição no lugar com comandos "dd" escritos com cuidado.
fonte