Ubuntu 终端 - 使用 gnu parallel 读取文件夹中所有文件中的行

Ubuntu terminal - using gnu parallel to read lines in all files in folder

我正在尝试计算 Ubuntu 下一个非常大的文件夹中所有文件的行数。

这些文件是 .gz 文件,我使用

zcat * | wc -l

统计所有文件中的所有行,而且很慢!

我想为此任务使用多核计算并找到 this 关于 Gnu 并行,

我尝试使用这个 bash 命令:

parallel zcat * | parallel --pipe wc -l

并且内核并非全部正常工作 我发现作业开始可能会导致大量开销,并尝试使用

进行批处理
parallel -X zcat * | parallel --pipe -X wc -l

没有改进,

如果文件夹中的所有文件都是 .gz 文件并且需要在计算行数之前解压缩(之后不需要让它们解压缩),我如何使用所有核心来计算文件夹中的所有文件的行数

谢谢!

基本上你要找的命令是:

ls *gz | parallel 'zcat {} | wc -l'

它的作用是:

  • ls *gz在标准输出上列出所有 gz 文件
  • 通过管道传输到 parallel
  • 使用 parallel
  • 生成子壳
  • 运行 在所述子外壳中引号内的命令 'zcat {} | wc -l'

关于“{}”,根据手册:

This replacement string will be replaced by a full line read from the input source

因此,通过管道传输到 parallel 的每条线都被馈送到 zcat。

当然这是基本的,我认为它可以进行调整,the documentation并且示例可能会有所帮助

如果您有 150,000 个文件,您可能会遇到 "argument list too long" 的问题。你可以这样避免:

find . -name \*gz -maxdepth 1 -print0 | parallel -0 ...

如果您想要行数旁边的名称,您必须自己 echo,因为您的 wc 进程只会从它的 stdin 中读取,而不会知道文件名:

find ... | parallel -0 'echo {} $(zcat {} | wc -l)'

接下来,我们来谈谈效率,这将取决于您的磁盘的能力。也许尝试 parallel -j2 然后 parallel -j4 看看你的系统有什么用。


正如 Ole 在评论中有用地指出的那样,您可以避免使用 GNU Parallel--tag 选项来标记输出行,这样效率更高:

find ... | parallel -0 --tag 'zcat {} | wc -l'