xargs
出力がラインであるプログラムを使用しようとしています。
<ARG1>
<ARG2>
...
<ARGN>
次のコマンドが実行されます。
command
<GLOBAL_PREFIX_1> \
<GLOBAL_PREFIX_2> \
... \
<PREFIX1> <PREFIX2> ... ARG1 <SUFFIX1> <SUFFIX2> ... \
<PREFIX1> <PREFIX2> ... ARG2 <SUFFIX1> <SUFFIX2> ... \
... \
<PREFIX1> <PREFIX2> ... ARGN <SUFFIX1> <SUFFIX2> ... \
<GLOBAL_SUFFIX_1> \
<GLOBAL_SUFFIX_2> \
...
ここで、プレフィックスとサフィックスはあらかじめ知られていますが、任意です。
とにかく明示的に言及する必要があると思ういくつかの(おそらく)明らかなメモは次のとおりです。
パラメータは次のとおりです。いいえ「いいね」改行文字が不足していますが、スペース、、、、
$
など(
を含めることができます)
。"
可能であれば、それらを1つの巨大な文字列に変換したり、その逆に変換したりするのを避けたいと思います。
はい、私が書いたことを意味します。私本物ただしたい1実行するコマンド:0ではない、2ではない、3ではない、
N
...より一般的に:私新しいプロセスを作成したくない各パラメータについて。
精度があると仮定すると、より簡単なツールが優先されます。したがって、
xargs
後者sed
がawk
等より優先します。ここでは標準 *nix シェルツールを使用しようとしています。
明らかにPythonスクリプトを書くことができますが、それはポイントではありません...
答え1
xargsは忘れて、whileループを使用してください。これはprintfが組み込まれていると仮定します。
#!/bin/sh
printf "%s\n" "command"
printf " %s\\\n" "<GLOBAL_PREFIX_1>" "<GLOBAL_PREFIX_2>" "..."
while read -r ; do
printf " <PREFIX1> <PREFIX2> ... %s <SUFFIX1> <SUFFIX2> ... \\\n" "$REPLY"
done
printf " %s\\\n" "<GLOBAL_SUFFIX_1>" "<GLOBAL_SUFFIX_2>"
printf " %s\n" "..."
PREFIXnまたはSUFFIXnにまたは類似の文字がinteresting
含まれている場合は、これらの文字をエスケープする必要があります。%
\
もちろん、sedは動作することができます。
sed '1i\
GP1\\\
GP2\\\
...\\
s/.*/P1 P2 & S1 S2\\/
$s/.*/&\
GS1\\\
GS2\\\
... '
awk の場合、BEGIN と END 句があります。
答え2
arg プレフィックスと arg サフィックスにスペースがない場合は、GNU Parallel の -X が適しています。
seq 1000 | parallel -X echo global prefix argpre{}argpost global postfix
コア数に均等に分配されます。気に入らない場合:
seq 1000 | parallel -j1 -n10 -X echo global prefix argpre{}argpost global postfix