xargsとGNUの並列性の違い

xargsとGNUの並列性の違い

2つのコマンドライン引数を使用するたびに、実行可能ファイルを複数回実行する必要があります。私はこの目的のためにそれを使用しましたが、xargs最近GNUが存在し、原則としてそれがより良いツールであるように見えましたparallel(より多くの機能、より最新、より広範な文書など)。

また、私にとって強力な販売ポイントは「代替」として使用できるという主張ですxargshttps://www.gnu.org/software/parallel/history.html)。しかし、この最後の点にはいくつかの問題があります。

args.txt複数行のテキストファイルがあるとします。各行には、スペースで区切られた2つの数字が含まれています。たとえば、次のようになります。

1 2
7 9
11 13

run各行に1回(つまり、各パラメータペアに1回)プログラムを実行したいと思います。そしてxargs私がやる

cat args.txt | xargs -n2 run

これは-n2、各呼び出しにxargs2つのパラメータを渡す必要があることを意味します。その後、各数値はパラメータとして解釈されるため、各行は2つのパラメータとして解釈されます。runxargsargs.txt

ただし、上記の状況に対するドロップイン代替品として使用しようとすると、parallel他の動作が発生します。xargs

これを説明するために、プログラムの代わりに次の小さなPythonスクリプトを使用して実行します。

プリンタ.py:

import sys
print([x for x in sys.argv[1:]])

xargsを使用すると、次のような結果が得られます。

> cat args.txt | xargs -n2 python printer.py

['1', '2']
['7', '9']
['11', '13']

parallel私が得るとき

> cat args.txt | parallel -n2 python printer.py

['1 2', '7 9']
['11 13']

したがって、xargsPythonスクリプトが別々の(スペースで区切られた)数を引数として使用すると、各行は単一のparallel引数として解釈されます。つまり、たとえば、最初の呼び出しの最初の引数"1 2""1"

parallelへの直接的な代替となることを期待していたので、これについては少し混乱していますxargs。しかし、明らかにそれよりも微妙です。私の質問は、parallel私がやっているのと同じことを達成するためにどのように使用する必要があるxargsのでしょうか。

ベストアンサー1

xargsとの間にいくつかの非互換性の1つが発生しており、parallelこれは意図的に設計されています。

GNU Parallel は入力が単一引数として引用されることを保証しますが、 xargs はそうではありません。これは、GNU Parallelの最初のバージョンを作成する原動力の1つでした。

$ echo '9" nails in 10" boxes' | xargs echo
9 nails in 10 boxes
$ echo '9" nails in 10" boxes' | parallel echo
9" nails in 10" boxes

ただし、GNU Parallelが入力を引用しないように強制できます。

cat args.txt | parallel python printer.py {=uq=}

これはコマンドから1行を取り、args.txt引用なしでコマンドに挿入します。

(バージョン20190722以降)。

別のオプションは、コメントで述べたように、列を個々のスペースに分割することです。

cat args.txt | parallel --colsep ' ' python printer.py

またはスペース:

cat args.txt | parallel --colsep '\s+' python printer.py

(バージョン20100822以降)。

おすすめ記事