Как ограничить (или усекать) текстовый файл по количеству строк?

Я хотел бы использовать терминал/оболочку для обрезания или иным образом ограничивать текстовый файл определенным количеством строк.

У меня есть целый каталог текстовых файлов, для каждого из которых полезны только первые строки ~ 50k.

Как удалить все строки более 50000?

Ответы

Ответ 1

Усечение на месте

Чтобы усечь файл на месте с помощью sed, вы можете сделать следующее:

sed -i '50001,$ d' filename
  • -i означает на месте.
  • d означает удаление.
  • 50001,$ означает строки от 50001 до конца.

Вы можете сделать резервную копию файла, добавив аргумент расширения в -i, например, .backup или .bak:

sed -i.backup '50001,$ d' filename

В OS-X или FreeBSD вы должны предоставить аргумент -i - чтобы сделать это, избегая создания резервной копии:

sed -i '' '50001,$ d' filename

Версия с длинными аргументами выглядит следующим образом: с аргументом резервного копирования и без него:

sed --in-place '50001,$ d' filename
sed --in-place=.backup '50001,$ d' filename

Новый файл

Чтобы создать новый усеченный файл, просто перенаправьте его с головы на новый файл:

head -n50000 oldfilename > newfilename
  • -n50000 означает количество строк, голова в противном случае по умолчанию равна 10.
  • > означает перенаправление, переписывание всего остального, что может быть там.
  • Замените >> на >, если вы хотите добавить в новый файл.

К сожалению, вы не можете перенаправить в тот же файл, поэтому sed рекомендуется для усечения на месте.

Нет sed? Попробуйте Python!

Это немного больше, чем sed. В конце концов, Sed сокращен для "Stream Editor", и это еще одна причина для его использования, это то, для чего подходит инструмент.

Это было протестировано в Linux и Windows с Python 3:

from collections import deque
from itertools import islice

def truncate(filename, lines):
    with open(filename, 'r+') as f:
        blackhole = deque((),0).extend
        file_iterator = iter(f.readline, '')
        blackhole(islice(file_iterator, lines))
        f.truncate(f.tell())

Чтобы объяснить Python:

Черная дыра работает как /dev/null. Это связанный метод extend на deque с maxlen=0, который является самым быстрым способом исчерпать итератор в Python (что я знаю).

Мы не можем просто переплетать объект файл, потому что метод tell будет заблокирован, поэтому нам нужен трюк iter(f.readline, '').

Эта функция демонстрирует контекстный менеджер, но это немного лишнее, поскольку Python закрывает файл при выходе из функции. Использование просто:

>>> truncate('filename', 50000)

Ответ 2

Очень просто использовать sed:

sed -n '1,50000 p' filename

Это приведет только к печати строк с 1 по 50000 в файле "filename".