Разделить файл gz и распаковать по отдельности

Разделить файл gz и распаковать по отдельности

У меня есть большой файл .gz, который сам по себе составляет 2,6 ГБ. Я не могу распаковать его из-за ограничения размера. Файл представляет собой один большой текстовый файл. Я не могу распаковать его полностью из-за ограничения размера. Я хочу разделить его, скажем, на 10 отдельных частей и распаковать каждую из них по отдельности, чтобы я мог использовать каждый отдельный файл:

У меня есть вопросы:

  1. Это возможно ?
  2. Также, как часть ответа, если можно, также предоставьте команды, так как я не очень хорошо разбираюсь в этих командах

Спасибо

решение1

Формат gzipсжатия поддерживает распаковку файла, который был объединен из нескольких меньших сжатых файлов (распакованный файл затем будет содержать объединенные распакованные данные), но не поддерживает распаковку разделенного сжатого файла.

Если вы хотите получить «фрагмент» распакованных данных, вы можете обойти это, загрузив распакованные данные в ddнесколько файлов, каждый раз выбирая другой фрагмент распакованных данных для сохранения в файле и отбрасывая остальные.

Здесь я использую небольшой текстовый файл-пример. Я многократно распаковываю его (чтоволязаймет немного времени для больших файлов), и каждый раз я выбираю 8-байтовый фрагмент из распакованных данных. Вы бы сделали то же самое, но использовали бы гораздо большее значение для bs("размер блока").

$ cat file
hello
world
1
2
3
ABC

$ gzip -f file   # using -f to force compression here, since the example is so small

$ gunzip -c file.gz | dd skip=0 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.007 secs (1063 bytes/sec)

$ cat fragment
hello
wo

$ gunzip -c file.gz | dd skip=1 bs=8 count=1 of=fragment
1+0 records in
1+0 records out
8 bytes transferred in 0.000 secs (19560 bytes/sec)

$ cat fragment
rld
1
2

(и т. д.)

Используйте bsнастройку, которая составляет примерно одну десятую отнесжатыйразмер файла, и в каждой итерации увеличивается skipот 0 на единицу.


ОБНОВЛЕНИЕ: Пользователь хотел подсчитать количество строк в несжатых данных (см. комментарии, прикрепленные к вопросу). Это легко сделать без необходимости сохранять какую-либо часть несжатых данных на диске:

$ gunzip -c file.gz | wc -l

gunzip -cраспакует файл и запишет несжатые данные в стандартный вывод. wcУтилита с -lфлагом будет читать из этого потока и подсчитывать количество прочитанных строк.

решение2

Ну, splitя с радостью разделю вещи для вас разными способами.

Чтобы сделать 10 отдельных частей, вам нужно знать размер несжатого файла. Следующее должно дать вам файлы размером около 1 ГиБ каждый.

gunzip < bigfile.gz | split --line-bytes=1G - bigfile-split

1G все еще много для текстового файла, многие редакторы плохо справляются с такими большими файлами. Поэтому в зависимости от того, что вы действительно хотите с ним сделать, вы можете захотеть использовать более мелкие разбиения. Или просто оставить как gz, достаточно хорошо работает для zgrepи других инструментов, даже если его приходится распаковывать каждый раз.

Если это файл журнала, вам, возможно, захочется более точно настроить ротацию журнала, чтобы естественным образом создавать более мелкие разбиения.

Связанный контент