Добавить в верхнюю часть большого файла: bash

У меня есть файл размером около 3 ГБ, который я бы хотел добавить в начало двух строк. Каждый раз, когда я пытаюсь вручную добавить эти строки, vim и vi замораживаются при сохранении (я позволяю им пытаться сэкономить около 10 минут каждый). Я надеялся, что есть способ просто добавить к вершине, точно так же, как и в нижней части файла. Единственное, что я видел до сих пор, однако, это временный файл, который, по моему мнению, будет медленным из-за размера файла. Я надеялся что-то вроде:

grep -top lineIwant >> fileIwant

Кто-нибудь знает хороший способ добавить в верхнюю часть файла?

Ответ 1

Try

cat file_with_new_lines file > newfile

Ответ 2

Я сравнивал сравнение с sed с редактированием на месте (как предложено здесь) для cat (как предложено здесь).

~ 3GB bigfile, заполненный точками:

$ head -n3 bigfile
................................................................................
................................................................................
................................................................................

$ du -b bigfile
3025635308      bigfile

Переместите строки новой строки с двумя строками для вставки поверх большого файла:

$ cat newlines
some data
some other data

$ du -b newlines
26      newlines

Результаты тестов с использованием dumbbench v0.08:

кошка:

$ dumbbench -- sh -c "cat newlines bigfile > bigfile.new"
cmd: Ran 21 iterations (0 outliers).
cmd: Rounded run time per iteration: 2.2107e+01 +/- 5.9e-02 (0.3%)

sed с перенаправлением:

$ dumbbench -- sh -c "sed '1i some data\nsome other data' bigfile > bigfile.new"
cmd: Ran 23 iterations (3 outliers).
cmd: Rounded run time per iteration: 2.4714e+01 +/- 5.3e-02 (0.2%)

sed с редактированием на месте:

$ dumbbench -- sh -c "sed -i '1i some data\nsome other data' bigfile"
cmd: Ran 27 iterations (7 outliers).
cmd: Rounded run time per iteration: 4.464e+01 +/- 1.9e-01 (0.4%)

Таким образом, sed, похоже, работает медленнее (80,6%) при редактировании на месте больших файлов, возможно, из-за перемещения промежуточного временного файла на место исходного файла. Использование перенаправления ввода-вывода sed только на 11,8% медленнее, чем у кота.

На основе этих результатов я бы использовал cat, как предложено в этом ответе.

Ответ 3

Попробуйте сделать это:

с помощью :

sed -i '1i NewLine' file

Или используя

ed -s file <<EOF
1i
NewLine
.
w
q
EOF

Ответ 4

Скорость такой операции сильно зависит от базовой файловой системы. Насколько я знаю, для этой конкретной операции нет оптимизированной FS. Большинство FS организуют файлы, используя полные блоки диска, за исключением последнего, которые могут быть частично использованы в конце файла. Действительно, файл размером N будет принимать блоки N/S, где S - размер блока, а еще один блок для оставшейся части файла (размер N%S, % является оператором остатка), если N не делится на S.

Обычно эти блоки ссылаются на их индексы на диске (или разделе), и эти индексы хранятся в метаданных FS, прикрепленных к файловой записи, которая их выделяет.

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

Некоторые FS могут реализовать возможность использования частично используемых блоков в списке (а не только как последнюю запись) используемых для файлов, но это не так уж и сложно.

См. другие вопросы SO для получения дополнительной информации:

На более высоком уровне, даже если эта операция поддерживается драйвером FS, все же возможно, что программы не используют эту функцию.

Для экземпляра этой проблемы, которую вы пытаетесь решить, лучший способ - это, вероятно, программа, способная cat включить новый контент и существующий в новый файл.

Ответ 5

  cat file

   Unix
   linux   

Он присоединяется к двум строкам файла одновременно с помощью команды

sed -i '1a C\n java' file

 cat file
   Unix
   C
   java
   Linux

вы хотите использовать INSERT, используя я и Replace, используя c