Ответ 1
Try
cat file_with_new_lines file > newfile
У меня есть файл размером около 3 ГБ, который я бы хотел добавить в начало двух строк. Каждый раз, когда я пытаюсь вручную добавить эти строки, vim и vi замораживаются при сохранении (я позволяю им пытаться сэкономить около 10 минут каждый). Я надеялся, что есть способ просто добавить к вершине, точно так же, как и в нижней части файла. Единственное, что я видел до сих пор, однако, это временный файл, который, по моему мнению, будет медленным из-за размера файла. Я надеялся что-то вроде:
grep -top lineIwant >> fileIwant
Кто-нибудь знает хороший способ добавить в верхнюю часть файла?
Try
cat file_with_new_lines file > newfile
Я сравнивал сравнение с 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, как предложено в этом ответе.
Попробуйте сделать это:
с помощью sed:
sed -i '1i NewLine' file
Или используя ed
ed -s file <<EOF
1i
NewLine
.
w
q
EOF
Скорость такой операции сильно зависит от базовой файловой системы. Насколько я знаю, для этой конкретной операции нет оптимизированной FS. Большинство FS организуют файлы, используя полные блоки диска, за исключением последнего, которые могут быть частично использованы в конце файла. Действительно, файл размером N
будет принимать блоки N/S
, где S
- размер блока, а еще один блок для оставшейся части файла (размер N%S
, %
является оператором остатка), если N
не делится на S
.
Обычно эти блоки ссылаются на их индексы на диске (или разделе), и эти индексы хранятся в метаданных FS, прикрепленных к файловой записи, которая их выделяет.
В этом описании вы можете увидеть, что можно было бы добавить контент, размер которого был бы кратен размеру блока, просто обновив метаданные с новым списком блоков, используемых файлом. Однако, если этот предварительный контент не заполняет точно несколько блоков, тогда существующие данные должны быть сдвинуты на эту большую сумму.
Некоторые FS могут реализовать возможность использования частично используемых блоков в списке (а не только как последнюю запись) используемых для файлов, но это не так уж и сложно.
См. другие вопросы SO для получения дополнительной информации:
На более высоком уровне, даже если эта операция поддерживается драйвером FS, все же возможно, что программы не используют эту функцию.
Для экземпляра этой проблемы, которую вы пытаетесь решить, лучший способ - это, вероятно, программа, способная cat
включить новый контент и существующий в новый файл.
cat file
Unix
linux
Он присоединяется к двум строкам файла одновременно с помощью команды
sed -i '1a C\n java' file
cat file
Unix
C
java
Linux
вы хотите использовать INSERT, используя я и Replace, используя c