使用并行重写嵌套循环,其中第二个循环的参数取决于第一个循环的参数

Rewriting nested loops using parallel where the arguments for second loop depends on arguments of first loop

用例: 我有两个嵌套的 for 循环,其中提供给第二个循环的参数取决于提供给第一个循环的参数。

for node in `ls -l $dir | grep $pattern1`
do
   for part in `ls -l $dir/$node | grep $pattern2`
   do something using $node and $part
done 
done

为了使用并行重写,我创建了一个函数:

doit(){
$node=
$part=
do something using $node and $part
}

parallel doit ::: <arguments for first for loop> ::: <arguments for second for loop>

运行 使用并行时如何提供这些参数?

GNU Parallel 无法直接执行此操作,因此您需要手动生成组合:

for node in `ls -l $dir | grep $pattern1`; do
    for part in `ls -l $dir/$node | grep $pattern2`; do
        printf "$node\t$part\n"
    done
done | parallel --dry-run --colsep '\t' doit {1} {2}

您可以像这样使用 skip()

parallel --dry-run doit '{= -e "$arg[1]/$arg[2]" or skip() =}' ::: all nodes ::: all parts