1

У меня есть большой файл text.gz (2 ГБ), и я хочу разбить его на строку. Я пытался использовать:

zcat text.gz | split -l1000000

Однако это привело к созданию огромного файла (около 92 ГБ, прежде чем я его прекратил) и к чрезмерной нагрузке на жесткий диск. Можно ли в gzip его труить на лету?

2 ответа2

2

Вот цикл вокруг awk и gzip , который разбивает файл на границы строк и сжимает части по ходу:

# Generate files part0.dat.gz, part1.dat.gz, etc.
prefix="part"
count=0
suffix=".dat"

lines=10000 # Split every 10000 line.

zcat thefile.dat.gz |
while true; do
  partname=${prefix}${count}${suffix}

  # Use awk to read the required number of lines from the input stream.
  awk -v lines=${lines} 'NR <= lines {print} NR == lines {exit}' >${partname}

  if [[ -s ${partname} ]]; then
    # Compress this part file.
    gzip --best ${partname}
    (( ++count ))
  else
    # Last file generated is empty, delete it.
    rm -f ${partname}
    break
  fi
done

Чтобы восстановить исходный файл, просто zcat part*.dat.gz | gzip --best >thefile1.dat.gz . Сжатый файл может иметь контрольную сумму MD5, отличную от оригинальной, из-за различных параметров сжатия gzip , но несжатые файлы будут абсолютно идентичны.

0

Это можно сделать лучше всего с помощью небольшой Perl-программы.

Я поднял один здесь: ftp://ftp.sqsol.co.uk/pub/tools/zsplit/

Взгляните на это и не стесняйтесь изменять его в соответствии с вашими личными потребностями.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .