3

フォルダー内のすべてのファイルに対して実行したいコマンドがあり、コマンドの構文は次のようになります。

tophat -o <output_file> <input_file>

私がやりたいのは、任意のフォルダー内のすべてのファイルをループし、入力ファイル名を使用して同様の異なる出力ファイル名を作成するスクリプトです。ファイル名は次のようになります。

input name                desired output name
path/to/sample1.fastq     path/to/sample1.bam
path/to/sample2.fastq     path/to/sample2.bam

入力を機能させるのは簡単に思えます:

for f in *.fastq
do
     tophat -o <output_file> $f
done

それを出力パラメータとして使用して使用しようoutput=${f,.fastq,.bam}としましたが、うまくいきません。私が得るのはエラーだけです: line 3: ${f,.fastq,.bam}: bad substitution. これは私がやりたいことをする方法ですか、それとも何か他のことをするべきですか? それが正しい方法である場合、私は何を間違っていますか?

[編集]:

すべての答えをありがとう!おまけの質問ですが...代わりに、次のような名前のファイルがある場合はどうなりますか:

path/to/sample1_1.fastq
path/to/sample1_2.fastq
path/to/sample2_1.fastq
path/to/sample2_2.fastq
...

...ここで、任意の数のサンプルを使用できますが ( sampleX)、それらすべてに 2 つのファイルが関連付けられています (_1および_2)。コマンドは次のようになります。

tophat -o <output_file> <input_1> <input_2>

したがって、出力は 1 つだけで、次のようなことができますが、関連付けられている両方のファイルを取得すると同時に、"${f/_[1-2].fastq/.bam}"毎回 1 回だけ反復するループを取得する方法がわかりません。アイデアはありますか?sampleX

[編集 #2]:

それで、これがトリックを実行した最終的なスクリプトです!

for f in *_1.fastq
do
        tophat -o "${f/_1.fastq/.bam}"  $f "${f/_1.fastq/_2.fasq}"
done
4

3 に答える 3

1

anubhavaの簡潔なソリューションの代替、

d=$(dirname path/to/sample1.fastq)
b=$(basename path/to/sample1.fastq .fastq)
echo $d/$b.fastq
path/to/sample1.fastq

tophat -o "$d/$b.fastq" "$f"
于 2014-09-23T18:20:56.627 に答える