Edite a primeira linha do arquivo de texto grande

16

Eu tenho um arquivo de texto enorme, grande demais para que a coisa toda seja paginada na memória. Tudo o que preciso fazer com esse arquivo de texto é editar a primeira linha (é um arquivo CSV e preciso alterar os títulos).

Existe uma maneira simples de fazer isso no bash?

linces
fonte
Existe algum motivo para você não poder usar apenas um editor de texto?
dangph
O arquivo é muito grande, é mais de 20 vezes maior que a minha memória virtual máxima nesta máquina.
Lynks
11
justo. Fiquei com a impressão de que bons editores de texto podiam lidar com arquivos muito grandes porque eles carregam apenas o necessário para a memória, mas depois de ler algumas das outras perguntas, parece que a maioria deles tem problemas com eles.
dangph
@dangph True ... pode ser estranho, mas alguns "editores de texto" antigos e obsoletos (ou os chamados) como edlinpara ms-dos ou edpara Unix não pareciam ter esse problema, mas apenas editores de linha ... RAM em esses tempos eram escassos e preciosos, e um tamanho de arquivo em Gigabytes era algo impossível de acreditar! ;)
laurent
Para deixar as coisas claras;): Eu não sinto falta ed!!! mas seria uma boa opção nesse caso (não tenho certeza de que ele poderia lidar com um arquivo desse tamanho ...) #
laurent laurent

Respostas:

21

Você pode usar lesspara ver o que deseja editar e usar sedpara fazer as alterações. Dessa forma, você edita sem carregar o arquivo inteiro.

Outra maneira é dividir o arquivo, editar e ingressar novamente:

split -b 10000k <file>

and to join:

cat xa* > <file>
Laurent
fonte
voto positivo para sed.
Atroon
Fantástico, dividir e participar era exatamente o que eu estava procurando, obrigado.
Lynks
com certeza, o sed é melhor, pois pode pesquisar / substituir o arquivo inteiro facilmente, mas se ele precisar alterar apenas a primeira linha, a divisão também não é ruim e mais rápida.
laurent
4
sed levaria horas para percorrer todo o arquivo (que tem pouco menos de meio TB), as alterações ocorreram apenas na primeira linha, separando-o parece sensato.
Lynks
3

Se sua modificação alterar o comprimento da linha, o arquivo inteiro precisará ser reescrito, consulte, por exemplo, esta discussão sobre SO. Você provavelmente deve considerar salvar os dados em um banco de dados.

Tendo isso em mente, você pode editar o arquivo com o sed. Para substituir a primeira linha, faça algo assim (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
fonte