2016-04-29 168 views
0

在bash shell中,我有一個打印一組名稱的變量。現在我想附加一個擴展名。我有以下名稱的序列文件:將變量傳遞給其他程序

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

我已經存儲通用名稱(Meoh和R3G在一個變量中)。在bash我運行沒有任何問題下面的腳本:

# 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 

現在我運行下面的代碼是不工作:

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 

上面的代碼不會產生像上面提供的工作代碼單獨的文件夾。

+0

爲什麼你寫'$ {i%}'而不是'$ {i}'?如果你不在後面放任何東西,'%'修飾符不會做任何事情。 – Barmar

+0

您不能將整個文件列表變量放在一個命令行中。它不會自動分割並重復每個元素的命令。你需要像你一樣使用循環。 – 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一次。