Как удалить определенные строки большого файла (›5G) с помощью команд Linux

У меня есть файлы очень большого размера (> 5G), и я хочу удалить некоторые строки по номерам строк без перемещения (копирования и вставки) файлов.

Я знаю, что эта команда работает для файла небольшого размера. (моя команда sed не распознает параметр -i)

sed "${line}d" file.txt > file.tmp && mv file.tmp file.txt

Эта команда занимает относительно много времени из-за размера. Мне просто нужно удалить первую строку и последнюю строку, но я также хочу знать, как, например, удалить строку с номером n.


person Jiho Noh    schedule 04.11.2016    source источник
comment
В чем проблема? Время этой операции или нет места на разделе?   -  person DevilaN    schedule 05.11.2016


Ответы (3)


Из-за того, что файлы хранятся в стандартных файловых системах (NTFS, EXTFS, ...), вы не можете удалять части файла на месте.

Единственное, что вы можете сделать на месте, это

  • добавить в конец файла (режим добавления)
  • изменять данные в файле (режим чтения-записи)

Другие операции должны использовать временный файл или временную память для полного чтения файла и обратной записи измененного файла.

РЕДАКТИРОВАТЬ: вы также можете "сжать" файл, прочитав здесь, используя программу C ( Linux или Windows будут работать), так что это означает, что вы можете удалить последнюю строку (но все же не первую строку или любую строку между ними)

person Jean-François Fabre    schedule 04.11.2016
comment
Понятно, но что, если строка, которую вы хотите удалить, является либо первой строкой, либо последней? Есть ли способ уменьшить файл в файловой системе, перемещая указатели (или эквивалентную метаинформацию) начала или конца файла? - person Jiho Noh; 05.11.2016
comment
см. мою правку. Может можно было бы убрать начало файла перемещением указателей но пришлось бы править блоки диска (суперпользователь + суперопасный :)) - person Jean-François Fabre; 05.11.2016

Если вы используете последнюю версию Linux, вы можете удалить фрагменты файла в любой позиции: https://lwn.net/Articles/415889/

person Javier    schedule 05.11.2016

вы можете использовать команду 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

person Adam    schedule 05.11.2016