awk 中的并行处理?

Vai*_*rde 6 awk batch-processing

awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行?是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据?

jll*_*gre 6

唯一一个试图提供 awk 并行实现的 awk 实现是parallel-awk,但看起来这个项目现在已经死了。

否则,并行化 awk 的一种方法是将输入分成块并并行处理。但是,分割输入数据仍然是单线程的,因此可能会破坏性能增强目标,主要问题是标准split命令无法在不读取每一行的情况下在行边界处拆分。

如果您有可用的 GNU split 或支持该-n l/*选项的版本,这里是一种并行处理文件的优化方法,假设您有 8 个 vCPU:

inputfile=input.txt
outputfile=output.txt
script=script.awk
count=8

split -n l/$count $inputfile /tmp/_pawk$$
for file in /tmp/_pawk$$*; do
    awk -f script.awk $file > ${file}.out &
done
wait
cat /tmp/_pawk$$*.out > $outputfile
rm /tmp/_pawk$$*
Run Code Online (Sandbox Code Playgroud)


bed*_*rin 6

您可以使用GNU Parallel来实现此目的

假设您正在计算一个大文件中的数字总和:

cat rands20M.txt | awk '{s+=$1} END {print s}'

使用 GNU Parallel,您可以在多个线程中执行此操作:

cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'