2つのコマンドライン引数を使用するたびに、実行可能ファイルを複数回実行する必要があります。私はこの目的のためにそれを使用しましたが、xargs
最近GNUが存在し、原則としてそれがより良いツールであるように見えましたparallel
(より多くの機能、より最新、より広範な文書など)。
また、私にとって強力な販売ポイントは「代替」として使用できるという主張ですxargs
(https://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
、各呼び出しにxargs
2つのパラメータを渡す必要があることを意味します。その後、各数値はパラメータとして解釈されるため、各行は2つのパラメータとして解釈されます。run
xargs
args.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']
したがって、xargs
Pythonスクリプトが別々の(スペースで区切られた)数を引数として使用すると、各行は単一の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以降)。
答え2
並列は、単語を読み取るxargsとは異なり、入力を一度に1行ずつ読みます。
次のように同じ結果が得られます。
> sed 's/\s\+/\n/g' args.txt | parallel -n2 python printer.py
ここで、sed
ツールはすべての空白グループを改行文字に変換します。