У меня очень большой файл (~ 400 ГБ), и мне нужно удалить из него последние 2 строки. Я пытался использовать sed
, но он работал в течение нескольких часов, прежде чем я сдался. Есть ли быстрый способ сделать это, или я застрял sed
?
linux
sed
text-manipulation
Расс Брэдберри
источник
источник
head -n -2 file
Ответы:
Я не пробовал это на большом файле, чтобы увидеть, насколько это быстро, но это должно быть довольно быстро.
Чтобы использовать сценарий для удаления строк из конца файла:
Он ищет конец файла, проверяет, является ли последний символ новой строкой, затем читает каждый символ по одному, возвращаясь назад, пока не найдет три символа новой строки, и усекает файл сразу после этой точки. Изменение сделано на месте.
Изменить: я добавил версию Python 2.4 в нижней части.
Вот версия для Python 2.5 / 2.6:
Вот версия Python 3:
Вот версия Python 2.4:
источник
Вы можете попробовать голову GNU
источник
head: illegal line count -- -2
Я вижу, что мои системы тестирования / сжатия Debian (но не Lenny / stable) включают команду "truncate" как часть пакета "coreutils".
С его помощью вы можете просто сделать что-то вроде
удалить 160 байтов из конца файла (очевидно, вам нужно точно определить, сколько символов вам нужно удалить).
источник
dd
скрипт сделает это (вам нужно указать смещение ввода, чтобы получить последний килобайт, а затем использоватьtail -2 | LANG= wc -c
, или что-то подобное).tail
также эффективен для больших файлов - можно использоватьtail | wc -c
для вычисления количества байт, которые нужно обрезать.Проблема с sed в том, что это потоковый редактор - он будет обрабатывать весь файл, даже если вы хотите вносить изменения ближе к концу. Поэтому, несмотря ни на что, вы создаете новый файл размером 400 ГБ, строка за строкой. Любой редактор, который работает с целым файлом, вероятно, будет иметь эту проблему.
Если вы знаете количество строк, вы можете использовать
head
, но опять же это создает новый файл вместо того, чтобы изменить существующий на месте. Я полагаю, вы можете получить выигрыш в скорости благодаря простоте действия.Вы , возможно , лучше удачи , используя
split
разбить файл на более мелкие куски, редактирования последнего, а затем с помощьюcat
соединить их снова, но я не уверен , если это будет лучше. Я бы использовал количество байтов, а не строк, иначе это, скорее всего, будет совсем не быстрее - вы все равно будете создавать новый файл объемом 400 ГБ.источник
Попробуйте VIM ... Я не уверен, что это сработает или нет, так как я никогда не использовал его на таких больших файлах, но в прошлом я использовал его на более крупных файлах.
источник
Что за файл и в каком формате? Может быть проще использовать что-то вроде Perl, в зависимости от того, какой это файл - текстовый, графический, двоичный? Как это отформатировано - CSV, TSV ...
источник
Если вы знаете размер файла в байтах (скажем, 400000000160) и знаете, что вам нужно удалить ровно 160 символов, чтобы убрать последние две строки, тогда что-то вроде
должен сделать свое дело. Прошло много лет с тех пор, как я использовал dd в гневе; Кажется, я помню, что дела идут быстрее, если вы используете больший размер блока, но то, сможете ли вы это сделать, зависит от того, достаточно ли кратны строки, которые вы хотите отбросить.
У dd есть некоторые другие опции для добавления текстовых записей к фиксированному размеру, что может быть полезно в качестве предварительного прохода.
источник
Если команда «truncate» не доступна в вашей системе (см. Мой другой ответ), посмотрите на «man 2 truncate» для системного вызова, чтобы обрезать файл до указанной длины.
Очевидно, вам нужно знать, до скольких символов вам нужно обрезать файл (размер минус длина проблемы, две строки; не забудьте подсчитать любые символы cr / lf).
И сделайте резервную копию файла, прежде чем попробовать это!
источник
Если вы предпочитаете решения в стиле Unix, вы можете сохранить и интерактивное усечение строк, используя три строки кода (протестировано на Mac и Linux).
small + safe усечение строки в стиле Unix (запрашивает подтверждение):
Это решение опирается на несколько распространенных инструментов Unix, но все еще использует его
perl -e "truncate(file,length)"
как ближайшую заменуtruncate(1)
, которая доступна не во всех системах.Вы также можете использовать следующую всеобъемлющую многократно используемую программу оболочки, которая предоставляет информацию об использовании и подтверждение усечения функций, анализ параметров и обработку ошибок.
полный скрипт усечения строки :
Вот пример использования:
источник
изменения сделаны на месте. Это проще и эффективнее, чем скрипт python.
источник
ed
потребовало в 100 раз больше времени, чем мой скрипт Python. Я могу только представить, насколько больше будет разница для файла ОП, который в 7000 раз больше.Изменен принятый ответ для решения аналогичной проблемы. Можно немного подправить, чтобы убрать n строк.
И соответствующий тест:
источник
Вы можете использовать Vim в режиме Ex:
-,
выберите последние 2 строкиd
удалятьx
сохранить и закрытьисточник