Удалите первые N строк файла в командной строке unix

Я пытаюсь удалить первые 37 строк из очень, очень большого файла. Я начал пробовать sed и awk, но они, похоже, требуют копирования данных в новый файл. Я ищу метод "удалить строки на месте", который в отличие от sed -i не делает копий любого рода, а скорее просто удаляет строки из существующего файла.

вот что я сделала...

awk 'NR > 37' file.xml > 'f2.xml'
sed -i '1,37d' file.xml

оба они, похоже, делают полную копию. Есть ли другой простой CLI, который может сделать это быстро без полного обхода документов?

4 ответов


нет простого способа сделать редактирование inplace с помощью утилит UNIX, но вот одно решение для модификации файла inplace, которое вы можете изменить, чтобы работать на вас (любезно предоставлено Робертом Бономи в https://groups.google.com/forum#!тема / сост.unix.оболочка / 5PRRZIP0v64):

count=$(head -37 "$file" |wc -c)
dd if="$file" bs="$count" skip=1 of="$file"

конечный файл должен быть $count байт меньше оригинала (так как целью было удалить $count байт с начала), поэтому для завершения мы должны удалить final $count байты. В системе GNU, такой как Linux, это может быть достигнуто:

truncate -s "-$count" "$file"

см. поток групп google, на который я ссылался для других предложений и информации.


семантика файлов Unix не позволяет усекать переднюю часть файла.

все решения будут основаны на:

  1. чтение файла в память, а затем запись его обратно (ed, ex, другими редакторами). Это должно быть хорошо, если ваш файл
  2. написание второй копии и при необходимости замена оригинала (sed -i, awk/tail > foo). Это нормально, если у вас достаточно свободного дискового пространства для понял, и не возражаю против ожидания.

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

возможно, ваш читатель пропускает комментарии и пустые строки? Если это так, вы можете создать сообщение, которое читатель игнорирует, убедитесь, что оно имеет то же количество байтов, что и 37 первых строк в вашем файле, и перезаписать начало файла с помощью dd if=yourdata of=file conv=notrunc.


Эд является стандартным редактором:

ed -s file <<< $'1,37d\nwq'

копия должна быть создана в какой - то момент-почему бы не во время чтения "измененного" файла; потоковая передача измененной копии вместо ее хранения?

Что я думаю-создайте именованный канал "file2", который является выходом того же файла awk 'NR > 37'.xml или что-то еще; тогда тот, кто читает file2, не увидит первые 37 строк.

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