1

我想将大型压缩 CSV 文件拆分为多个较小的 gzip 文件,并在行边界上拆分。

我正在尝试通过管道将 gunzip 传输到 bash 脚本,同时读取 LINE。该脚本写入一个命名管道,后台 gzip 进程正在重新压缩它。每读取一个 X 字符,我都会关闭 FD 并重新启动新的 gzip 进程以进行下一次拆分。

但是在这种情况下,带有 while read LINE 的脚本消耗了 90% 的 cpu,因为 read 在这里效率很低(我知道它会进行一次系统调用来读取 1 个字符)。

关于有效地做到这一点的任何想法?我希望 gzip 消耗大多数 cpu。

4

2 回答 2

2

split-l选项一起使用以指定所需的行数。使用--filter选项$FILE是用于输出到文件的名称 split (并且必须用引号引起来以防止外壳过早扩展:

zcat doc.gz | split -l 1000 --filter='gzip > $FILE.gz'

如果您需要任何其他处理,只需编写一个脚本,该脚本将接受文件名作为参数并相应地处理标准输入,并使用它而不是 plain gzip

于 2012-12-07T16:36:21.007 回答
0

如何使用split带有-l选项的命令?

gzcat large.csv.gz | split -l 1000 - xxx
gzip xxx*
于 2012-12-07T16:41:07.553 回答