1

У меня есть очень большой файл (~ 450 МБ), который занимает слишком много времени, чтобы полностью загрузить (и сохранить), но мне нужно изменить только несколько строк, которые всегда находятся в одной позиции (те же номера строк). Файл создан, и у меня нет контроля над форматом.

Есть ли способ читать и писать только эти строки?

2 ответа2

1

Если вы можете поддерживать одинаковый размер, добавляя пробелы и т.д., Вы можете использовать dd чтобы извлечь деталь, отредактировать ее, убедиться, что она того же размера, и записать ее обратно. Смотрите man dd для деталей (смещение, размер блока и т.д.)

Если вы не можете сохранить тот же размер, вам все равно нужно открыть весь файл, потому что все после редактирования должно быть соответственно смещено.

Вы не сказали, насколько большой файл, но emacs может обрабатывать большие файлы (или размещать иначе, пока все действительно большие файлы, которые мне нужно отредактировать, могут обрабатываться emacs).

0

Для обработки больших файлов вы можете выбрать один из двух подходов: использовать визуальный редактор, который удобно работает с большими файлами, или программно редактировать построчно. Тем не менее, файл 450 МБ не должен быть проблематичным для многих редакторов.

  1. Джо - это текстовый редактор, который приемлемо работает с большими файлами.

  2. Если вы заранее знаете, какие строки нужно редактировать, то есть их можно идентифицировать, не просматривая содержимое файла (по номеру строки или поиску), один из вариантов sed , awk или perl может быть допустимой альтернативой. Возможно, вы захотите напечатать интересующие вас строки перед их редактированием.


Тесты: все эти решения хорошо работают в теории, но какое из них сэкономит вам больше всего времени?

Для очень грубого теста я создал текстовый файл объемом 1 ГБ, 33 миллиона строк на VPS KVM с 2vCPU (Xeon E5-2690 @ 2,90 ГГц), 2 ГБ ОЗУ и 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 был самым быстрым в чтении всего файла и отображении одной строки
  • sed был самым быстрым в выполнении подстановки и сохранении в другой файл
  • perl был самым быстрым в выполнении подстановки и сохранении под тем же именем файла

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .