Как разбить файл на n частей?
У меня есть файл, содержащий несколько строк. Я хочу разделить файл на n файлов. Неважно, сколько строк присутствует в каждом файле. Мне просто нужны конкретные файлы no.of(скажем, 5). здесь проблема заключается в том, что никакие строки в исходном файле не изменяются. Поэтому мне нужно рассчитать количество строк, а затем просто разделить файлы на 5 частей. Если возможно, мы должны отправить каждый из них в разные каталоги.
Ответы
Ответ 1
В bash вы можете использовать команду split
, чтобы разбить ее на основе количества желаемых строк. Вы можете использовать команду wc
для определения количества строк. Здесь wc
в сочетании с split
в одну строку.
Например, чтобы разделить onepiece.log
на 5 частей
split -l$((`wc -l < onepiece.log`/5)) onepiece.log onepiece.split.log -da 4
Это создаст такие файлы, как onepiece.split.log0000
...
Примечание: разделение bash округляется, поэтому, если есть остаток, будет файл с 6-й частью.
Ответ 2
Предполагая, что вы обрабатываете текстовый файл, затем wc -l
, чтобы определить общее количество строк и split -l
для разделения на указанное количество строк (общее количество /5 в вашем случае). Это работает в UNIX/Mac и Windows (если у вас установлен cygwin)
Ответ 3
В linux существует команда split
,
split --lines=1m /path/to/large/file /path/to/output/file/prefix
Вывести фрагменты фиксированного размера INPUT в PREFIXaa, PREFIXab,...; размер по умолчанию - 1000 строк, а по умолчанию PREFIX - "x". Без INPUT или INPUT - прочитайте стандартный ввод.
...
-l, --lines = NUMBER поместите NUMBER строки в выходной файл
...
Однако вам нужно было бы рассчитать фактический размер расколов заранее.
Ответ 4
Я могу придумать несколько способов сделать это. То, что вы будете использовать, сильно зависит от данных.
-
Строки фиксированной длины: найдите размер файла, прочитав его запись в каталоге и разделите его на длину строки, чтобы получить количество строк. Используйте это, чтобы определить, сколько строк в файле.
-
Файлы должны иметь примерно одинаковое количество строк. Снова прочитайте размер файла из записи в каталоге. Прочитайте первые N строк (N должно быть небольшим, но разумной частью файла) для вычисления средней длины строки. Вычислите приблизительное количество строк на основе размера файла и прогнозируемой средней длины строки. Это предполагает, что длина линии следует нормальному распределению. Если нет, настройте свой метод на случайные выборки строк (с помощью seek() или чего-то подобного). Перемотайте файл после вашего среднего значения, затем разделите его на основе прогнозируемой длины строки.
-
Прочитайте файл дважды. Первый раз подсчитывает количество строк. Второй раз разбивая файл на нужные части.
EDIT. Используя оболочку script (согласно вашим комментариям), рандомизированная версия # 2 будет сложной, если вы не написали небольшую программу для этого. Вы можете использовать ls -l
для получения размера файла wc -l
для подсчета точного количества строк и head -nNNN | wc -c
для вычисления средней длины строки.