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

标签 linux bash shell

我想将大型压缩 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/

相关文章:

linux - 可以将 10 个相似的函数变成一个 for 循环吗?

linux - 如何将很棒的 WM 与 LXSession(LXDE、Lubuntu)结合使用

linux - 设置变量时找不到 bash 命令

ruby-on-rails - 启动 irb 或脚本/控制台时未执行 ~/.irbrc

linux - 用于删除文件的 shell 脚本,其中文件有序列号

linux - 命令行参数到shell脚本的转换?

linux - npm 安装失败

c++ - 输出流中的第一个字符被该流中删除的最后一个字符替换。为什么会这样?

linux - 如何仅从 TCPDUMP 文件中提取目标端口

python - 使用 shell/python/perl 仅从文件中提取行一次