Назад | Перейти на главную страницу

Как разбить текст из конвейера на N файлов одинакового размера?

Я хочу направить поток в split. Я знаю, насколько большим будет поток в байтах (очень большой, поступает из сети), я хочу разделить, чтобы создать N файлов относительно равного размера, без разделения строк пополам. Возможно ли этого добиться. Что-то вроде:

cat STREAM | split $SIZE_OF_STREAM $NUMBER_OF_FILES_TO_PRODUCE

Я не мог найти способ добиться этого с помощью документации, извините, если это было очевидно, но я не смог его найти.

Ну, кажется, что split Утилита на Mac (и, возможно, BSD) - это один из вариантов :(

В Linux есть -C опция, которая позволяет указать, сколько байтов для каждого фрагмента строк. Или проще говоря - если вы пройдете cat file | split -C 1000, он создаст куски ДО 1000 байт целых строк, что с помощью элементарной математики дает мне простой способ добиться того, чего я хотел.

Я бы просто Трещина on line count, так как это сделает все файлы, кроме последнего, почти равными.

export LINE_COUNT=100,000
cat $STREAM | split -l $LINE_COUNT

Вы можете выполнить математику с помощью $ SIZE_OF_STREAM, разделенного на $ NUMBER_OF_FILES_TO_PRODUCE, но просто установка количества строк дает вам 90% пути для того, чтобы все файлы были в основном равными, если длина вашей строки не распределена очень ненормальным образом.

Я сделал ссылку на онлайн-документацию, но страницы руководства поставляются с OS X, поэтому вы можете видеть, что разделение там имеет обрезание байтов, а также обрезание строки.

создать файл, который будет выходить СТРИМ:

echo "1234\n5678" > xfile

сейчас разделю это

for i in $(seq 0..`wc -c xfile|awk '{print $1}'`); do let a=`expr $i \* 2`; dd if=xfile of=file$i bs=1 count=2 skip=$a; done

он даст вам журнал файлов с фиксированным размером 2 байта и именами file1, file2, file3 ....