Abra parcialmente e modifique um arquivo de texto no Linux

1

Eu tenho um arquivo muito grande (~ 450MB) que leva muito tempo para carregar completamente (e salvar), mas eu preciso alterar apenas algumas linhas que estão sempre na mesma posição (os mesmos números de linha). O arquivo é gerado e eu não tenho controle sobre o formato.

Existe uma maneira de ler e escrever apenas essas linhas?

    
por user61801 17.09.2018 / 10:09

2 respostas

0

Para lidar com arquivos grandes, você pode escolher uma das duas abordagens: use um editor visual que trabalhe confortavelmente com arquivos grandes ou edite programaticamente linha por linha. Dito isso, um arquivo de 450MB não deve ser problemático para muitos editores.

  1. joe é um editor de texto que funciona bem com grandes arquivos.

  2. Se você souber de antemão quais linhas precisam ser editadas, ou seja, elas podem ser identificadas sem você olhar o conteúdo do arquivo (por número de linha ou pesquisa), um sed , awk ou perl poderia ser uma alternativa válida. Você pode querer imprimir as linhas de seu interesse antes de editá-las.

Benchmarks: todas essas soluções funcionam bem na teoria, mas qual delas economizará mais tempo?

Para o propósito de um benchmark muito difícil , criei um arquivo de texto de 1GB, 33 milhões de linhas em um KVM VPS com 2vCPU (Xeon E5-2690 @ 2.90GHz), 2GB de RAM e RAID SSD .

  40s --> Joe (opening the file, editing a line, saving, exiting)

   2s --> sed -n '15000000p;15000000q' file.txt
   3s --> sed -n '149p' file.txt
  10s --> sed '149s/File/Pile/' file.txt > file2.txt
3m15s --> sed -i '149s/File/Pile/' file.txt

   4s --> perl -ne 'if($.==15000000){print;exit}' file.txt
   8s --> perl -ne 'print if $.==149' file.txt
  19s --> perl -pe 's/File/Pile/ if $.==149' file.txt > file2.txt
  20s --> perl -i -pe 's/File/Pile/ if $.==149' file.txt

   4s --> awk -n 'NR==15000000{print;exit}' file.txt
   8s --> awk -n 'NR==149{print}' file.txt
  15s --> awk 'NR==149{gsub("File","Pile")}1' file.txt > file2.txt
 4m3s --> awk -i inplace 'NR==149{gsub("File","Pile")}1' file.txt
  • sed foi o mais rápido em ler o arquivo inteiro e exibir uma única linha
  • sed foi o mais rápido em realizar uma substituição e salvar em um arquivo diferente
  • perl foi o mais rápido em realizar uma substituição e salvar no mesmo nome de arquivo
por 17.09.2018 / 17:02
1

Se você pode manter o mesmo tamanho preenchendo espaços, etc., você pode usar dd para extrair uma parte, editá-la, certificar-se de que é do mesmo tamanho e gravá-la de volta. Veja man dd para detalhes (offset, tamanho de bloco, etc.)

Se você não puder manter o mesmo tamanho, será necessário abrir o arquivo completo de qualquer maneira, porque tudo após a edição deve ser alterado de acordo.

Você não disse quão grande o arquivo é, mas emacs pode manipular arquivos grandes (ou de forma diferente, até agora todos os arquivos realmente grandes que eu precisava editar poderiam ser manipulados por emacs ).

    
por 17.09.2018 / 12:29

Tags