回答:
for file in xyz*
do
./transeq "$file" "${file}.faa" -table 11
done
これは、現在のディレクトリfor
で始まるすべてのファイルを反復処理し、最初の引数としてファイル名、2番目の引数として「.faa」、「-table 11」が続くファイル名でプログラムをxyz
呼び出す単純なループです./transeq
。 。
"$file".faa
インタラクティブなワンライナーの一部として入力するのが少し簡単で、.faa
引用する必要のあるシェルメタキャラクターが含まれていないため安全です。
GNU Parallelをインストールすると、次のように並行して実行できます。
parallel ./transeq {} {}.faa -table 11 ::: xyz*
プログラムがCPUを集中的に使用する場合、かなり高速化されるはずです。
bash
コマンドラインで次のようなことができます:
printf '%s\n' {1..5025} | xargs -l -I {} -t ./transeq xyz{} xyz{}.faa -table 11
1から5025の整数を1行で生成し、それらを1つずつxargsに送ります。これにより、整数がカプセル化さ{}
れ、適切な方法で./transeqコマンドラインに移植されます。
ブレース拡張機能がない{n..m}
場合は、seq
ユーティリティを呼び出してこれらの数値を生成できます。
または、次の方法で数値生成をいつでもエミュレートできます。
yes | sed -n =\;5025q | xargs ...
for i in {1..5025}; do ./transeq "xyz$i" "xyz$i".faa -table 11; done
考えやすく、入力しやすい方法です。コマンドを実行する前にコマンドを印刷する場合は、を使用しますset -x
。
for i in
{1..5025}
を達成するために使用します。bashで書くこともできますが、私は入力するのが速いので、通常は範囲構文を使用します。for ((i=1 ; i<=5025 ; i++)); do ./transeq "xyz$i" "xyz$i".faa -table 11; done
{a..b}
複数のコアがあり、各呼び出しが他の呼び出しから独立して実行できると仮定すると、並列実行でかなり高速化されます。
これを行う比較的簡単な方法は、次の-P
パラメーターをxargs
使用することです。たとえば、4つのコアがある場合:
echo xyz{1..5025} | \
xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11
の -n 1
伝えxargs
各呼び出しのためのリストのうちの一つだけの引数を選択する(デフォルトでは、それはたくさん通過する)、そして-P 4
同時に4つのプロセスを生成するためにそれを伝えます- 1つのダイは、新しいものを生み出しています。
私見、この単純なケースではGNU parallelをインストールする必要はありません- xargs
十分です。
for file in xyz*; do ./transeq "$file" "${file}.faa" -table 11; done
。私はいつもこの種のものを入力します。また、ファイル名などが希望どおりに拡張されていることを確認する場合echo
はdo
、1回目を右に置き、シェル履歴に戻って2回目に削除します。