2010-07-07 2 views
13

У меня есть файл, содержащий несколько строк. Я хочу разделить файл на n файлов. Неважно, сколько строк присутствует в каждом файле. Мне просто нужны конкретные файлы no.of (скажем, 5). здесь проблема заключается в том, что никакие строки в исходном файле не изменяются. Поэтому мне нужно рассчитать количество строк, а затем просто разделить файлы на 5 частей. Если возможно, мы должны отправить каждый из них в разные каталоги.Как разбить файл на n из частей

+2

С помощью чего? Инструмент, язык программирования, скрипт ...? –

+0

Windows, Linux? На каких языках у вас есть? –

+0

Я должен сделать это в UNIX –

ответ

4

В Linux есть split команда,

split --lines=1m /path/to/large/file /path/to/output/file/prefix 

выход фиксированного размера кусков ВВОДА к PREFIXaa, PREFIXab, ...; размер по умолчанию - 1000 строк, а по умолчанию PREFIX - «x». Без INPUT или INPUT - прочитайте стандартный ввод.

...

-l, --lines = ЧИСЛО положить ЧИСЛО строк в выходной файл

...

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

+1

Это разбивается на строки или байты? –

+0

здесь размер файла также меняется ежедневно .. Так что мне нужен общий ответ, где мы не должны использовать ни размер, ни число. –

+0

Мне нужно написать сценарий оболочки для этого. Может ли кто-нибудь помочь мне с этим –

6

Предполагая, что вы обрабатываете текстовый файл, а затем wc -l, чтобы определить общее количество строк и split -l, чтобы разделить на указанное количество строк (всего/5 в вашем случае). Это работает в UNIX/Mac и Windows (если у вас установлено cygwin)

0

Я могу придумать несколько способов сделать это. То, что вы будете использовать, сильно зависит от данных.

  1. Строки фиксированной длины: Найдите размер файла, прочитав это запись каталога и разделить на длину линии, чтобы получить количество строк. Используйте это, чтобы определить, сколько строк в файле.

  2. Файлы должны иметь примерно одинаковое количество строк. Снова прочитайте размер файла из записи в каталоге. Прочитайте первые N строк (N должно быть небольшим, но разумной частью файла) для вычисления средней длины строки. Вычислите приблизительное количество строк на основе размера файла и прогнозируемой средней длины строки. Это предполагает, что длина линии следует нормальному распределению. Если нет, настройте свой метод на случайные выборки строк (с помощью seek() или чего-то подобного). Перемотайте файл после вашего среднего значения, затем разделите его на основе прогнозируемой длины строки.

  3. Прочтите файл дважды. Первый раз подсчитывает количество строк. Второй раз разделил файл на нужные части.

EDIT: Использование сценария оболочки (в соответствии с вашими комментариями), рандомизированного версия # 2 будет трудно, если не написал небольшую программу, чтобы сделать это для вас. Вы должны иметь возможность использовать ls -l, чтобы получить размер файла wc -l, чтобы подсчитать точное количество строк и head -nNNN | wc -c, чтобы рассчитать среднюю длину линии.

19

В 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 ...

Примечание: Баш деление округляется, так что если есть остаток там будет быть файлом 6-й части.

+8

** split -da 4 -l $ (('wc -l grasshopper

+0

отличное улучшение, @grasshopper – Flowpoke

+0

этот ответ более краток, чем два [более высокие вопросы] (http://stackoverflow.com/questions/7764755/unix-how-to-split- a-file-to-equal-parts-without-break-individual-lines) в stackoverflow и askubuntu. –

Смежные вопросы