2016-04-29 12 views
0

bashシェルでは、一連の名前を出力する変数があります。今では拡張機能を追加したいと思います。他のプログラムに変数を渡す

Meoh_R1.fastq 
Meoh_R2.fastq 
R3G_R1.fastq 
R3G_R2.fastq 

私は変数にMeohとR3Gを格納しています。 bashで、私は何の問題もなく、スクリプトを以下のコマンドを実行します。

filelist=$(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
mkdir -p ${i%}_fastqc 
fastqc -o ./${filelist%}_fastqc -f fastq ./rnaseq/${filelist%}_R1.fastq ./rnaseq/${filelist%}_R2.fastq 

コードの上に上記の作業のコードのような個々のフォルダを作成しません:

# Stores common names in variable `i` (meoh and r3g) 
for i in $(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
do 
    # Make direcotry for fastqc 
    mkdir -p ${i%}_fastqc 
    # Run fastqc 
    fastqc -o ./${i%}_fastqc -f fastq ./rnaseq/${i%}_R1.fastq ./rnaseq/${i%}_R2.fastq 
done 

を今、私は働いていない次のコードを実行します。

+0

なぜ '$ {i%}'の代わりに '$ {i%}'と書いていますか? '%'修飾子は、後に何も置かないと何もしません。 – Barmar

+0

ファイルリスト変数全体を、そのような1つのコマンドラインに入れることはできません。それは自動的に分割されず、各要素のコマンドを繰り返します。あなたはあなたのようにループを使用する必要があります。 – Barmar

答えて

1

はここでループなしで取得する方法です:

filelist=$(ls ./raw_reads | grep ^[^d]| rev | cut -c 10- | rev | uniq) 
echo "$filelist" | sed 's/.*/&_fastqc/' | xargs mkdir -p 
echo "$filelist" | xargs -I{} fastqc -o ./{}_fastqc -f fastq ./rnaseq/{}_R1.fastq ./rnaseq/{}_R2.fastq 

これは、各入力ファイルにfastqc一度実行している、しかし、ループと同じ効果を持つことになります。