使用循环组合命令

时间:2019-03-08 17:51:09

标签: for-loop nested-loops

我想使用 Hisat2 对单端的数千个样本进行校准,每个样本分布在不同的库中。

我修改了此脚本(https://www.biostars.org/p/223404/#224169):

> 0

它给我回声为:

#!/bin/bash
for f in `ls data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/*.fastq.bz2_trimmed.fq.gz | sed 's/.fastq.bz2_trimmed.fq.gz//g' | sort -u`
do
echo HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U ${f}.fastq.bz2_trimmed.fq.gz -S ${f}.bam
done

因为这是相同的样本( Alst-1_6989 ),所以分配在不同的通道( SRR3460433,SRR3460434,SRR3460435,SRR3460436 )之间,应使用逗号而不是逗号下面是一个单独的命令,我想要输出文件( Alst-1_6989.bam )中样本的名称( Alst-1_6989 ),目前是分布式文件的名称图书馆。这只是一个例子,我有数千个带有可变数量的分布式库的示例,因此我们需要牢记这一点。

HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460433.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460433.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460434.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460434.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460435.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460435.bam
HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460436.fastq.bz2_trimmed.fq.gz -S data/1547_2015/Accessions/Alst-1_6989/transcriptome/fastq/trim/SRR3460436.bam

我认为一些为循环设置的方法可以工作,或者类似这样的方法,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

Don't parse ls

全路径文件名不应该是重复的,所以我放弃了sort
我将假设每个样本的文件数量合理。
为此-

base="$PWD"
cmdtrunk="HISAT/hisat2-2.1.0/hisat2 --p 8 --min-intronlen 60 --max-intronlen 6000 --dta -x Hisat2_index/arabidopsis -U "
shopt -s nullglob                         # return empty if not matched
for sample in data/1547_2015/Accessions/* # assumes no spaces, etc
do [[ -d "$base/$sample" ]] || continue   # ignore files in this dir
   lst=( $( find "$base/$sample/transcriptome/fastq/trim/" -name \*.fastq.bz2_trimmed.fq.gz -print0 |
       while read -r -d '' f; do printf "%s\n" "$f"; done ) ) 
   if (( ${#lst[@]} ))
   then stack="$( printf "%s," "${lst[@]}" )"
        printf " %s\n" "$cmdtrunk ${stack%,} -S $base/$sample/${sample##*/}.bam"
   fi
done

我没有像这样的结构,所以没有像我想的那样测试过。尽管如此,但它所做的只是打印命令,您可以在执行之前保存并检查这些命令。

让我知道发生了什么问题,我们将对其进行修复。