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'
我正在尝试计算 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'