web-dev-qa-db-ja.com

コマンドライン引数をGNU並列で分割

GNU parallelの使用: http://www.gnu.org/software/parallel/

私は2つの引数を取るプログラムを持っています、例えば。

$ ./prog file1 file2
$ ./prog file2 file3
...
$ ./prog file23456 file23457

ファイル名のペアを生成するスクリプトを使用していますが、スクリプトの結果がペアではなく単一の文字列であるため、これは問題を引き起こします。お気に入り:

$ ./prog "file1 file2"

GNU parallelの袖にはたくさんのトリックがあるようですが、区切り文字の周りにテキストを分割するためのトリックがあるのではないかと思います。

$ generate_file_pairs | parallel ./prog ?  
  # where ? is text under consideration, like "file1 file2"

簡単な回避策は、progで手動で引数を分割することですが、GNU parallelでそれが可能かどうかを知りたいです。

37
drhodes

あなたはおそらく--colsepを探しています。

generate_file_pairs | parallel --colsep ' ' ./prog {1} {2}  

詳細については、man parallelをお読みください。まだ行っていない場合は、紹介ビデオをご覧ください http://www.youtube.com/watch?v=OpaiGYxkSuQ

66
Ole Tange

Parallelのマニュアルでは、次のように述べられています。

コマンドが指定されていない場合、入力行が実行されます... GNU parallelは、xargsまたはcat | bashの代わりに使用できることがよくあります。

だから試してみてください:

generate command | parallel

これの出力を理解してみてください:

for i in {1..5};do echo "echo $i";done | parallel
1
Liang

あなたは探している -n並列のオプション。これはあなたが探しているものです:

./generate_file_pairs | parallel -n 2 ./prog {}

GNU Parallel Doc からの抜粋:

-n max-args
    Use at most max-args arguments per command line. Fewer than max-args 
    arguments will be used if the size (see the -s option) is exceeded, 
    unless the -x option is given, in which case GNU parallel will exit.
1
ssapkota