Эффективное удаление заголовка на месте для больших файлов с помощью sed?

Следующие команды могут занять несколько минут, зависит от размера файла. Есть ли более эффективный метод?

sed -i 1d large_file 

5 Solutions collect form web for “Эффективное удаление заголовка на месте для больших файлов с помощью sed?”

Попробуйте вместо этого:

 ed <<< $'1d\nwq' large_file 

Если этот «большой» означает около 10 миллионов строк или больше, лучше использовать tail . Не в состоянии для редактирования на месте, но его производительность делает это недостижимым:

 tail -n +2 large_file > large_file.new 

Изменить, чтобы показать некоторые временные различия:

( awk код от Jaypal добавлен, чтобы иметь время выполнения на том же компьютере (CPU 2.2GHz).)

 bash-4.2$ seq 1000000 > bigfile.txt # further file creations skipped bash-4.2$ time sed -i 1d bigfile.txt time 0m4.318s bash-4.2$ time ed -s <<< $'1d\nwq' bigfile.txt time 0m0.533s bash-4.2$ time perl -pi -e 'undef$_ if$.==1' bigfile.txt time 0m0.626s bash-4.2$ time { tail -n +2 bigfile.txt > bigfile.new && mv -f bigfile.new bigfile.txt; } time 0m0.034s bash-4.2$ time { awk 'NR>1 {print}' bigfile.txt > newfile.txt && mv -f newfile.txt bigfile.txt; } time 0m0.328s 

Невозможно эффективно удалить вещи с самого начала файла. Удаление данных с самого начала требует повторной записи всего файла.

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

Теоретически это было бы «быстро», если бы вы полностью удалили весь блок / степень, но для этого нет системных вызовов, поэтому вам придется полагаться на семантику, специфичную для файловой системы (если таковая существует). (Или, если у вас есть какая-то форма смещения внутри первого блока / степени, чтобы отметить реальный старт файла, я думаю. Никогда об этом не слышал.)

Вы можете использовать Vim в режиме Ex:

 ex -sc '1d|x' large_file 
  1. 1 выберите первую строку

  2. d удалить

  3. x сохранить и закрыть

Самый эффективный метод, не делайте этого! Если вы это сделаете, в любом случае вам нужно в два раза больше «большого» пространства на диске, и вы будете тратить IO.

Если вы застряли в большом файле, который хотите прочитать без первой строки, подождите, пока вам не понадобится прочитать его для удаления 1-й строки. Если вам нужно отправить файл из stdin в программу, используйте для этого хвост:

 tail -n +2 | your_program 

Когда вам нужно прочитать файл, вы можете воспользоваться возможностью, чтобы удалить 1-ю строку, но только если у вас есть необходимое место на диске:

 tail -n +2 | tee large_file2 | your_program 

Если вы не можете читать из stdin, используйте fifo:

 mkfifo large_file_wo_1st_line tail -n +2 large_file > large_file_wo_1st_line& your_program -i large_file_wo_1st_line 

еще лучше, если вы используете bash, воспользуйтесь заменой процесса:

 your_program -i <(tail -n +2 large_file) 

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

 large_file_generator | tail -n +2 > large_file 

Кроме того, всегда существует решение по выбору fifo или процесса:

 mkfifo large_file_with_1st_file large_file_generator -o large_file_with_1st_file& tail -n +2 large_file_with_1st_file > large_file_wo_1st_file large_file_generator -o >(tail -n 2+ > large_file_wo_1st_file) 

Это просто теоретизация, но …

Пользовательская файловая система (реализованная с использованием FUSE или аналогичного механизма) может выставить каталог, содержимое которого точно совпадает с уже существующим каталогом где-то в другом месте, но с файлами, урезанными по вашему желанию. Файловая система переведет все смещения файлов. Тогда вам не придется делать много времени для перезаписи файла.

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

  • Как я могу передать $ 1 в sed?
  • Как изменить специальный символ в linux с помощью переменной
  • Строки - Извлечь версию файла Рекурсивный
  • Удалить первую строку файла
  • Как заменить значение для данного условия в определенном столбце файла
  • извлечение части строки из определенного столбца
  • Фильтрация журнала на последней букве в строке
  • Как комментировать snmpmibd и snmpd в rc.tcpip в AIX с помощью sed?
  • Как я могу разобрать xml-файл с URL-адреса http без загрузки файла и распечатать нужную строку?
  • нечувствительный к регистру sed - OpenWrt
  • Удалить строковый файл после пробела
  • Linux и Unix - лучшая ОС в мире.