Как удалить определенные строки большого файла (>5G) с помощью команд Linux
У меня есть файлы очень большого размера (> 5G), и я хочу удалить некоторые строки по номерам строк без перемещения (копирования и вставки) файлов.
Я знаю, что эта команда работает для файла небольшого размера. (моя команда sed не распознает опцию -i)
sed "${line}d" file.txt > file.tmp && mv file.tmp file.txt
Эта команда занимает относительно много времени из-за размера. Мне просто нужно удалить первую строку и последнюю строку, но также хочу знать, как, например, удалить номер строки n.
3 ответа
Поскольку файлы хранятся в стандартных файловых системах (NTFS, EXTFS, ...), вы не можете удалить части файла на месте.
Единственное, что вы можете сделать на месте, это
- добавить в конец файла (режим добавления)
- изменить данные в файле (режим чтения-записи)
Другие операции должны использовать временный файл или временную память, чтобы полностью прочитать файл и записать его обратно измененным.
РЕДАКТИРОВАТЬ: вы также можете "сжать" файл, как прочитано здесь, с помощью программы на C (Linux или Windows будет работать), так что это означает, что вы можете удалить последнюю строку (но все же не первую строку или любую строку между ними)
Вы можете использовать ed
команда, которая очень похожа на sed
ed -s file.text
Вы можете использовать d
команда, $d
удалит последнюю строку, пока 1d
удалит первый, и wq
напишу и выйду.
Следующая команда будет делать все (удалить первую и последнюю строку, написать и выйти)
echo -e '1d\n$d\nwq' | ed -s test.txt
с помощью sed
вы можете использовать те же команды sed '1d;$d' test.txt
Если вы используете последнюю версию Linux, вы можете удалить куски файла в любом положении: https://lwn.net/Articles/415889/