如何将管道中的文本分割成 N 个大小相同的文件?

如何将管道中的文本分割成 N 个大小相同的文件?

我想将一个流传输到split。我知道流的字节数是多少(非常大,来自网络),我希望 split 创建 N 个大小相对相等的文件,而不将行分成两半。可以实现吗?例如:

cat STREAM | split $SIZE_OF_STREAM $NUMBER_OF_FILES_TO_PRODUCE

我无法通过文档找到实现该目标的方法,如果它很明显,我很抱歉,但我找不到它。

答案1

哦,好吧,看来splitMac(也许是 BSD)上的实用程序缺少一个选项 :(

在 Linux 上,有-C一个选项,可以让你指定每行有多少字节。或者简单地说 - 如果你传递 cat file | split -C 1000,它将创建最多 1000 个字节的整行块,这通过初等数学让我可以轻松地实现我想要的。

答案2

我只想分裂按行数计数,这样将使得除最后一个文件之外的所有文件几乎相等。

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

你可以用 $SIZE_OF_STREAM 除以 $NUMBER_OF_FILES_TO_PRODUCE 来计算,但只要设置行数,就可以使所有文件基本相等,除非你的行长度以非常非正常的方式分布。

我已经链接到在线文档,但是手册页随 OS X 一起提供,因此您可以看到那里的分割具有字节截止和行截止。

答案3

创建将输出 STREAM 的文件:

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.... 的文件日志。

相关内容