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

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

Вот что я сделал …

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

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

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

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

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

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

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

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

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

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

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

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

    ed – стандартный редактор:

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

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

    Я думаю – создайте именованный канал «file2», который является результатом того же самого awk ‘NR> 37’ file.xml или что-то еще; то тот, кто читает файл2, не увидит первые 37 строк.

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

    Давайте будем гением компьютера.