bashを使用して、コマンドラインで一重引用符を使用するプログラムを繰り返します。ここで一重引用符は bash スクリプトの意図を無効にします。

bashを使用して、コマンドラインで一重引用符を使用するプログラムを繰り返します。ここで一重引用符は bash スクリプトの意図を無効にします。

質問:

ディレクトリ内の各.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シェルループのパス名ジェネレータのように動作します。

関連:


=。を割り当てるときに周囲にスペースを入れないでください。コードには構文エラーがいくつかあります。また、変数拡張は二重引用符で囲む必要があります。

おすすめ記事