2016-04-29 169 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一次。