Ответ 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)