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