多くのファイル(xyz1、xyz2、xyz5025まで)を含むフォルダーがあり、それらすべてに対してスクリプトを実行して、xyz1.faa、xyz2.faaなどを出力として取得する必要があります。
単一ファイルのコマンドは次のとおりです。
./transeq xyz1 xyz1.faa -table 11
それを自動的に行う方法はありますか?多分for-doコンボ?
for file in xyz*
do
./transeq "$file" "${file}.faa" -table 11
done
これは単純なfor
ループで、現在のディレクトリでxyz
で始まるすべてのファイルを反復処理し、最初の引数としてファイル名を指定して./transeq
プログラムを呼び出します。ファイル名は2番目の引数として「.faa」が続き、その後に「-table 11」が続きます。
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行で生成してから、xargsに1つずつ入力します。これにより、整数が{}
にカプセル化され、適切な方法で./transeqコマンドラインに移植されます。 。
ブレース展開機能{n..m}
がない場合は、seq
ユーティリティを呼び出してこれらの数値を生成できます。
または、次の方法で常に数値生成をエミュレートできます。
yes | sed -n =\;5025q | xargs ...
複数のコアがあり、各呼び出しが他の呼び出しとは独立して実行できると仮定すると、並列実行でかなりのスピードアップが得られます。
これを行う比較的簡単な方法は、-P
xargs
のパラメーター-たとえば、4つのコアがある場合:
echo xyz{1..5025} | \
xargs -n 1 -P 4 -I{} /path/to/transeq xyz{} xyz{}.faa -table 11
-n 1
は、呼び出しごとにリストから引数を1つだけ選択するようxargs
に指示します(デフォルトでは、それは十分に渡されます)、および-P 4
は、同時に4つのプロセスを生成するように指示します。1つが終了すると、新しいプロセスが生成されます。
私見、GNUをインストールする必要はありません。この単純なケースではパラレルです-xargs
で十分です。
ファイルをディレクトリ内に分散している場合に便利な検索の使用
find -name "xyz*" -exec ./transeq {} {}.faa -table 11 \;
xarg
を使用できます
ls | xargs -L 1 -d '\n' your-desired-command
-L 1
は一度に1つのアイテムを渡します
-d '\n'
ls
の出力を作成すると、新しい行に基づいて分割されます。