有没有一种有效的方法来读取bash中的行输入?

时间:2012-12-07 16:30:22

标签: linux bash shell

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

我试图用一段时间读取LINE来将gunzip传递给bash脚本。该脚本写入命名管道,其中后台gzip进程正在重新压缩它。读取每个X字符我关闭FD并重新启动新的gzip进程以进行下一次拆分。

但是在这种情况下,脚本在读取LINE时占用了90%的cpu,因为这里的读取效率很低(我知道它会使系统调用一次读取1个字符)。

有效地做这件事吗?我希望gzip能够占用多数cpu。

2 个答案:

答案 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*