awk 逐行处理文件。假设每行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据?
唯一尝试提供 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$$*
您可以使用 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}'