Редактировать первую строку большого текстового файла

16

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

Есть ли простой способ сделать это в bash?

Lynks
источник
Есть ли какая-то причина, по которой вы не можете просто использовать текстовый редактор?
dangph
Файл слишком большой, он более чем в 20 раз больше моей максимальной виртуальной памяти на этом компьютере.
Линкс
1
справедливо. У меня сложилось впечатление, что хорошие текстовые редакторы могут работать с очень большими файлами, потому что они загружают в память столько, сколько им нужно, но после прочтения некоторых других вопросов кажется, что у большинства из них с ними проблемы.
dangph
@dangph True ... может быть странным, но некоторые старые и устаревшие "текстовые редакторы" (или так называемые), такие как edlinдля ms-dos или edдля Unix, похоже, не имели этой проблемы, но где только линейные редакторы ... RAM в эти времена были редкостью и ценностью, а размер файла в гигабайтах был невозможен! ;)
Лоран
Чтобы все прояснилось;) Я не скучаю ed!!! но это было бы хорошо в этом случае (не уверен, что он может обработать файл такого размера ...)
Лоран

Ответы:

20

Вы можете использовать, lessчтобы увидеть, что вы хотите редактировать и использовать sedдля внесения изменений. Таким образом, вы редактируете без загрузки всего файла.

Другой способ - разделить файл, отредактировать и снова присоединиться:

split -b 10000k <file>

and to join:

cat xa* > <file>
Laurent
источник
upvote для сед.
atroon
Фантастика, разделение и соединение были именно тем, что я искал, спасибо.
Линкс
Конечно, sed лучше, так как он может легко искать / заменять весь файл, но если ему нужно всего лишь изменить первую строку, split тоже неплох и быстрее.
Лоран
4
Седу потребовались бы часы, чтобы просмотреть весь файл (который составляет чуть меньше половины ТБ), изменения были только в первой строке, разделение на части кажется разумным.
Линкс
3

Если ваша модификация изменяет длину строки, весь файл должен быть переписан, см., Например, это обсуждение SO. Возможно, вам следует рассмотреть возможность сохранения данных в базе данных.

Имея это в виду, вы можете редактировать файл с помощью sed. Чтобы заменить первую строку, сделайте что-то вроде этого (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Тор
источник