bashのforループはディレクトリに新しいファイルを入力します。

bashのforループはディレクトリに新しいファイルを入力します。

背景情報:私はProkka(生命情報学の初心者、Prokkaがなく、Bashの経験がほとんどありません)を実行しており、FASTAファイルがいくつかあります。

FASTAファイルを1つずつ入力できるBashループを作成する必要があると聞きました。

例:すべてのFASTA(.fna)ファイルを含むディレクトリの名前はStaphFNAで、その中に1000個のFASTAファイルがあります。すべてID番号に名前が付けられますが、通常のようにインクリメントされるのではなく(1、2、3などで番号付けされていない)ランダムジャンプがあります。たとえば、最初のものは34872、次は8933です。

最初のFASTAファイルをStaphFNAに入力してProkkaで処理し、「StaphProkka」というファイルに出力する必要があります。そして、第2のFASTAファイルも同じ処理を経て、再び「StaphProkka」に出力される。 1000個すべてが完了するまでこの方法を続けます。

想像できるように、この作業を1000回実行するのは少し難しいのでループをしたいのですが、私は初めてbashに触れて苦労しています。

私のProkkaの主張(私の考えにはこれが正しい):

prokka /Users/me/Documents/StaphFNA --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus

私のForループ(これが間違っていることを知っています):

i = 0
for i in StaphFNA/.fna*; do
    prokka /Users/me/Documents/StaphFNA/$i --outdir StaphProkka --prefix staph_aur --kingdom bacteria --locusting staphylococcus
i = i + 1
done

ベストアンサー1

出力ファイルを指定する必要がなく、prokkaが入力に応じて異なる名前のファイルを生成する場合、必要なものは次のとおりです。

for file in /Users/me/Documents/StaphFNA/*.fna; do
    prokka "$file" \ 
        --outdir StaphProkka \
        --prefix staph_aur \
        --kingdom bacteria \
        --locusting staphylococcus 
done

このfor variable in dir/*パターンは各ファイルやディレクトリを繰り返し、対応dir/するパス名を保存するため、$variableカウンタなどは必要ありません。たとえば、処理file1.faなどのカウンタを使用する必要があり、file2.fa処理を望まない場合は、otherfile.fa次のようにすることができます(周囲にスペースがないことに注意してください。=重要です)。

for ((i=0; i<=10; i++)); do
    someCommand "file${i}.fa"
done

または、明示的にカウンタを増やす必要がある場合(まれな場合)、次のことを実行できます。

i=0
while [ "$i" -le 10 ]; do
    echo someCommand "file${i}.fa"
    (( i++ ))
done

おすすめ記事