zaLinux.ru

Как разбить большой файл (текстовый или бинарный) на файлы меньшего размера (РЕШЕНО)


Инструкция по использованию split

У меня есть большой (по количеству строк) текстовый файл, который я хотел бы разделить на файлы меньшего размера, также по количеству строк. Поэтому, если в моем файле около 2 млн строк, я хотел бы разделить его на 10 файлов, содержащих 200 тыс. строк, или 100 файлов, содержащих 20 тыс. строк (плюс один файл с остатком; равномерность деление не имеет значения).

Для этого можно написать скрипт на PHP или Python, но если вы используете Bash, то вы можете воспользоваться готовой утилитой split, которая умеет разбивать как текстовые, так и бинарные файлы на части указанного размера. Если это текстовый файл, то можно разбить большой файл на файлы равного размера с определённым количеством строк. Эта статья расскажет как пользоваться командой split.

Как разбить текстовый файл на файлы с определённым количеством строк

Чтобы разбить файл по числу строк, выполните команду вида:

split -l СТРОКИ ФАЙЛ

Например:

split -l 200000 filename

создаст файлы, в каждом из которых будет по 200000 строк с именами xaa xab xac …

Как разбить файлы на тома определённого размера

Если вы хотите разбить файлы по размеру, то используйте опцию -C (файлы будут разбиты по строкам, разрывов строк не будет)

split -C 20M --numeric-suffixes ВХОДНОЙ_ФАЙЛ ВЫХОДНОЙ_ПРЕФИКС

Это команда создаёт файлы вида ВЫХОДНОЙ_ПРЕФИКС01 ВЫХОДНОЙ_ПРЕФИКС02 ВЫХОДНОЙ_ПРЕФИКС03 … каждый с максимальным размером в 20 мегабайт.

Команда split обычно работает со строками ввода (то есть из текстового файла). Но если мы используем параметр -b, мы заставляем split рассматривать файл как двоичный ввод, а строки игнорируются. Мы можем указать размер файлов, которые мы хотим, вместе с префиксом, который мы хотим для выходных файлов. split также может использовать параметр -d, чтобы дать нам числовую нумерацию (*.01 , *.02 , *.03 и т. д.) для выходных файлов, а не алфавитную, которая применяется по умолчанию (*.aa , *.ab , *.ac, и т.д.). Параметр -a указывает длину суффикса. Команда выглядит так:

split -d -a ЧИСЛО -b РАЗМЕРG ФАЙЛ_ДЛЯ_РАЗБИВКИ ПРЕФИКС_ВЫХОДНЫХ_ФАЙЛОВ

где ЧИСЛО — длина расширения (или суффикса), которое мы будем использовать, а РАЗМЕР — это размер результирующих файлов с модификатором единиц. Аргумент РАЗМЕР — это целое число и необязательная единица измерения (пример: 10K равно 10*1024). Единицей измерения может быть: KM, G, T, P, E, Z, Y (степень 1024) или KBMB, GB, TB… (степень 1000). Также можно использовать двоичные префиксы: KiB=K, MiB=M и так далее.

К примеру, разделим образ диска на файлы размером 4 ГБ с помощью следующей команды (размер последнего файла будет соответствовать оставшейся части тома, если он не является точно кратным выбранному вами размеру):


split -d -a 3 -b 4G case1.disk1.raw case1.disk1.split.

Это приведёт к созданию группы файлов (размером 4 ГБ), каждый из которых будет назван префиксом case1.split1, как указано в команде, за которым следует .000, .001, .002 и т. д. Параметр -a с 3 указывает, что мы хотим, чтобы расширение было не менее 3 цифр. Без -a 3 наши файлы будут называться .00 , .01 , .02 и т. д. братите внимание на конечную точку в имени нашего выходного файла. Мы делаем это так, чтобы суффикс добавлялся как расширение файла, а не в конец строки имени.

Итак, опции -C и -b являются взаимоисключающими. Главное предназначение опции -C сохранять целостность строк, то есть эту опцию нужно указывать для текстовых файлов, например, для словарей. Размер файлов, создаваемых с помощью -C может чуть различаться из-за необходимость уписать последнюю строку целиком. А опция -b позволяет делить файлы на равные части, даже если это требует разрыва строк, то есть эта опция подходит для бинарных файлов.

Как разделить файл на указанное количество частей

Для разбития на определённое количество фрагментов используется опция -n КУСКИ (длинная запись --number=КУСКИ).

Для указания КУСКОВ используется следующий синтаксис:

  • N — делить на N файлов, их размер будет определён автоматически в зависимости от размера ввода

Следующая команда разобьёт файл dig.txt на три равные части:

split -n 3 dig.txt
  • K/N — разделить файл на N частей и вывести в стандартный вывод часть номер K

Следующая команда выведет в стандартный вывод первую десятую часть файла t.txt, стандартный вывод вместо показа на экране будет сохранён в файл t.txt:

split -n 1/10 dig.txt > t.txt

Следующая команда выведет в стандартный вывод вторую десятую часть файла t.txt, стандартный вывод вместо показа на экране будет сохранён в файл t2.txt:

split -n 2/10 dig.txt > t2.txt
  • l/N — разделить файл на N частей без разбития строк/записей
  • l/K/N — разделить файл на N частей и вывести в стандартный вывод часть номер K без разбития строк/записей
  • r/N — как «l», но использовать циклическое распределение (Round-robin). К примеру, следующая команда
split -n r/10 dig.txt

означает, что файл dig.txt нужно разбить на 10 частей. Причём в первом файле будет каждая первая из десяти строк, то есть это первая, одиннадцатая, двадцать первая, тридцать первая и так далее записи. Во втором файле будет каждая вторая из десяти строк, то есть это вторая, двенадцатая, двадцать вторая, тридцать вторая и так далее строки.

  • r/K/N — как и предыдущий вариант, но вывести в стандартный вывод только часть номер K из N

Как файл разделённый на части собрать в один файл

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


cat case1.disk1.split* > case1.disk1.new.raw

В приведённой выше команде мы повторно собрали разделённые части в новый файл образа размером 80 ГБ. Исходные разделённые файлы не удаляются.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *