使用 awk 进行并行操作

使用 awk 进行并行操作

我有大约 3,000 个文件,每个文件大小为 300MB,我想使用我的 16 核服务器尽快在它们中搜索一系列子字符串。

这是我尝试过的但它似乎无法并行搜索文件。

sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc

它是从不同的操作指南中粘贴过来的,我不太明白。您对如何拆分文件处理有什么建议吗?

答案1

  1. 查看你parallel的系统上是否有这个程序。(它可能来自 GNU。)如果有,弄清楚如何使用它。否则,
  2. 运行findwith ,将输出输出到文件。使用文本编辑器或使用类似工具的脚本head,将该文件拆分为 16 个片段文件,每个片段文件的行数(大约)相等(即引用相等数量的找到的文件)。然后启动 16 个awk … | paste … | bc管道;每个片段文件一个。(并添加 16 个结果。)

我想知道为什么您要用它awk来计算一个字符串的出现次数,而这个字符串grep -c是专门为做这件事而设计的。

答案2

GNU parallel 与 xargs 非常兼容,在你的情况下它可以替代它。如果你只计算substring使用grep -c次数斯科特建议:

sudo find /mnt2/preprocessed/preprocessed/mo* | 
  sudo parallel grep -c source | paste -sd+ | bc

请注意,某些版本的 GNU/Linux 以“Tollef 的并行”兼容模式安装 GNU parallel。您可以通过将--gnu命令行参数添加到 parallel 来更改此设置。要使更改永久生效,请添加--gnu~/.parallel/config

相关内容