我想将大型压缩的CSV文件拆分为多个较小的gzip文件,并在行边界上拆分。
我正在尝试将 gunzip 管道传输到带有一段时间阅读 LINE 的 bash 脚本。该脚本写入命名管道,其中后台 gzip 进程正在重新压缩它。每读取 X 个字符,我就会关闭 FD 并重新启动一个新的 gzip 进程以进行下一次拆分。
但是在这种情况下,脚本在读取 LINE 时消耗了 90% 的 CPU,因为这里的读取效率非常低(我知道它会进行系统调用一次读取 1 个字符)。
对有效地做到这一点有什么想法吗?我希望 gzip 会消耗大部分 CPU。
将split
与-l
选项一起使用,以指定所需的行数。使用--filter
选项$FILE
是拆分用于输出到文件的名称(并且必须用单引号引起来,以防止过早地扩展 shell:
zcat doc.gz | split -l 1000 --filter='gzip > $FILE.gz'
如果您需要任何其他处理,只需编写一个脚本,该脚本将接受文件名作为参数并相应地处理标准输入,并使用它而不是普通gzip
。
将split
命令与-l
选项一起使用怎么样?
gzcat large.csv.gz | split -l 1000 - xxx
gzip xxx*