Я хочу направить поток в 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 ....