13

Bash で while ループを次のように処理しています。

while IFS=$'\t' read -r -a line;
do
    myprogram ${line[0]} ${line[1]} ${line[0]}_vs_${line[1]}.result;
done < fileinput

参照用に、この構造を持つファイルから読み取ります。

foo   bar
baz   foobar

など (タブ区切り)。

GNU 並列を使用して (エントリが多く、処理が遅くなる可能性があるため) このループを並列化したいのですが、ここで行うように、各行を配列に割り当てる方法が明確ではありません。

可能な解決策は何ですか (GNU 並列作業の代替手段も同様です)?

4

3 に答える 3

9

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Use-a-table-as-inputから:

"""
table_file.tsv の内容:

foo<TAB>bar
baz <TAB> quux

走る:

cmd -o bar -i foo
cmd -o quux -i baz

実行できます:

parallel -a table_file.tsv --colsep '\t' cmd -o {2} -i {1}

"""

したがって、あなたの場合は次のようになります。

cat fileinput | parallel --colsep '\t' myprogram {1} {2} {1}_vs_{2}.result
于 2013-05-16T16:26:55.910 に答える
6

parallelここでは厳密には必要ありません。バックグラウンドですべてのプロセスを開始し、完了するまで待ちます。read入力する変数を複数指定できるため、配列も不要です。

while IFS=$'\t' read -r f1 f2;
do
    myprogram "$f1" "$f2" "${f1}_vs_${f2}.result" &
done < fileinput
wait

これにより、リスト内のすべてのアイテムに対して単一のジョブが開始されますparallelが、一度に実行されるジョブの数が制限される可能性があります。で同じことを実行できますが、bash注意が必要です。

于 2013-05-16T18:18:12.743 に答える