我想将大型压缩 CSV 文件拆分为多个较小的 gzip 文件,按行边界拆分。
我正在尝试通过 while read LINE 将 gunzip 传输到 bash 脚本。该脚本写入命名管道,后台 gzip 进程正在重新压缩它。每读取 X 个字符,我就关闭 FD 并为下一次拆分重新启动一个新的 gzip 进程。
但在这种情况下,脚本 while read LINE 消耗了 90% 的 cpu,因为这里的读取效率很低(我知道它会进行一次系统调用以读取 1 个字符)。
有没有想过如何有效地做到这一点?我希望 gzip 占用大部分 cpu。
最佳答案
使用 split
和 -l
选项来指定你想要的行数。使用 --filter
选项 $FILE
是 split 用于输出到文件的名称(并且必须用单引号引起来以防止过早地通过 shell 扩展:
zcat doc.gz | split -l 1000 --filter='gzip > $FILE.gz'
如果您需要任何额外的处理,只需写一个脚本,它将接受文件名作为参数并相应地处理标准输入,并使用它代替普通的 gzip
。
关于linux - 有没有一种有效的方法来读取 bash 中的行输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13767095/