
質問:
ディレクトリ内の各.fnaファイルに対してbashループでプログラムを実行できるようにしたいのですが、出力ファイルのファイル名が拡張子なしで同じになることを望みます。問題は、プログラムが一重引用符を使用して指定することです。出力文書。したがって、スクリプトを実行すると、次のメッセージが表示されます。
outputfile
パスワード:
for fna in $(find . -name "*.fna")
do
outputname = ${fna%.fna}
outputfile = $outputname.rrna
barrnap $fna --outseq 'outputfile'
done
入力例
1つの名前:
GCF_000003135.1_ASM313v1_genomic.fna
コンテンツを例に挙げましょう。
>NZ_GG666849.1 Bifidobacterium longum subsp. longum ATCC 55813 SCAFFOLD1, whole genome shotgun
sequence
AACCCCGTGGAGTTCACACAACAAGGTGTATTTAGTCAAGTCGGTGTTTCGTGTTTCGTCACTGATTTTTTTCACTGCGG
AAA
希望の出力:
プログラムの出力ファイル名は次のとおりです。
GCF_000003135.1_ASM313v1_genomic.rrna
混乱させて申し訳ありません。これを説明するための最良の方法を考えるのが難しくなり、誰でもタイトルの改善を提案できる場合は、すぐにタイトルを変更します。
答え1
このプログラムは一重引用符を使用しません。一重引用符は、シェルが引用符付き文字列に対して変数拡張を実行するのを防ぐために使用されます。シェルはプログラムを呼び出す前に引用符を削除します。
この場合、一重引用符が引用する文字列は、シェルが実行する拡張子のない一般的な文字列であるため、何もしません(これはコードのバグであるため、二重引用符を$outputfile
使用する必要があるかもしれません)。
ファイルが現在のディレクトリ(そしてそのディレクトリにのみ存在する場合)にある場合は、次のことができます。
for fasta in ./*.fna; do
barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done
または中間変数を使用してください。
for fasta in ./*.fna; do
outfile="${fasta%.fna}.rrna"
barrnap --outseq "$outfile" "$fasta"
done
ここでは、一重引用符の代わりに二重引用符を使用します。考えるシェルは拡張を実行します。また、入力ファイル名を呼び出しからコマンドラインの末尾に移動しました。barrnap
入力ファイル名も呼び出しに移動しました。手動。
ファイルが現在のディレクトリ内の複数のサブディレクトリにあり、それを使用する必要があるfind
場合は、出力を繰り返すのではなくプログラムを呼び出してみfind
ましょう。find
find . -type f -name '*.fna' -exec sh -c '
for fasta do
barrnap --outseq "${fasta%.fna}.rrna" "$fasta"
done' sh {} +
ここでは、find
シェルループのパス名ジェネレータのように動作します。
関連:
=
。を割り当てるときに周囲にスペースを入れないでください。コードには構文エラーがいくつかあります。また、変数拡張は二重引用符で囲む必要があります。