如何将配对fastq文件识别逻辑适配到For Loop批量处理
处理成对fastq文件的for循环适配问题
问题背景
我想把一个已解决的测序数据分析方案适配到for循环中,批量处理文件夹内的成对fastq文件,让每对文件独立处理并生成对应命名的输出。
示例输入文件
WT1_0min-SRR9929263_1.fastq WT1_0min-SRR9929263_2.fastq WT1_20min-SRR9929265_1.fastq WT1_20min-SRR9929265_2.fastq WT3_20min-SRR12062597_1.fastq WT3_20min-SRR12062597_2.fastq
配对文件识别命令
可用以下命令识别每对fastq文件:
find . -name '*_1.fastq' -exec basename {} '_1.fastq' \; | xargs -n1 -I{} echo {}_1.fastq {}_2.fastq
处理需求
- 禁止批量传入所有文件(如下形式):
-1 WT1_0min-SRR9929263_1.fastq,WT1_20min-SRR9929265_1.fastq,WT3_20min-SRR12062597_1.fastq -2 WT1_0min-SRR9929263_2.fastq,WT1_20min-SRR9929265_2.fastq,WT3_20min-SRR12062597_2.fastq
- 要求通过for循环依次处理每对文件:
Iteration #1 -1 WT1_0min-SRR9929263_1.fastq -2 WT1_0min-SRR9929263_2.fastq Iteration #2 -1 WT1_20min-SRR9929265_1.fastq -2 WT1_20min-SRR9929265_2.fastq Iteration #3 -1 WT3_20min-SRR12062597_1.fastq -2 WT3_20min-SRR12062597_2.fastq
尝试的错误代码
我编写了以下for循环但无法正常运行,推测需要将xargs输出的配对文件名保存为变量供循环调用:
find . -name '*_1.fastq' -exec basename {} '_1.fastq' \; | xargs -n1 -I{} echo {}_1.fastq {}_2.fastq for file in *.fastq do bowtie2 -p 8 -x /path/genome \ 1- {}_1.fastq \ 2- {}_2.fastq \ "../path/${file%%.fastq}_UnMappedReads.fastq.gz" \ 2> "../path/${file%%.fastq}_Bowtie2_log.txt" | samtools view -@ 7 -b | samtools sort -@ 7 -m 5G -o "../path/${file%%.fastq}_Mapped.bam" done
预期输出文件
WT1_0min-SRR9929263_UnMappedReads.fastq.gz WT1_20min-SRR9929265_UnMappedReads.fastq.gz WT3_20min-SRR12062597_UnMappedReads.fastq.gz WT1_0min-SRR9929263_Bowtie2_log.txt WT1_20min-SRR9929265_Bowtie2_log.txt WT3_20min-SRR12062597_Bowtie2_log.txt WT1_0min-SRR9929263_Mapped.bam WT1_20min-SRR9929265_Mapped.bam WT3_20min-SRR12062597_Mapped.bam
解决方案
直接遍历所有*_1.fastq文件,提取每对文件的共同前缀,即可实现循环处理:
# 遍历所有_1.fastq文件 for read1 in ./*_1.fastq; do # 提取每对文件的共同前缀(去掉末尾的_1.fastq) prefix="${read1%_1.fastq}" # 对应_2.fastq文件的路径 read2="${prefix}_2.fastq" # 获取输出文件的前缀(去掉路径,仅保留文件名) out_prefix=$(basename "$prefix") # 执行bowtie2比对及后续samtools处理流程 bowtie2 -p 8 -x /path/genome \ -1 "$read1" \ -2 "$read2" \ --un-conc-gz "../path/${out_prefix}_UnMappedReads.fastq.gz" \ 2> "../path/${out_prefix}_Bowtie2_log.txt" | samtools view -@ 7 -b | samtools sort -@ 7 -m 5G -o "../path/${out_prefix}_Mapped.bam" done
关键修正说明
- 简化循环逻辑:直接遍历
*_1.fastq文件,避免复杂的find+xargs管道,更易维护 - 参数修正:原命令中bowtie2的
1-/2-应为-1/-2,同时添加--un-conc-gz参数才能生成指定的未映射reads压缩文件 - 输出命名:通过
basename获取纯文件名作为输出前缀,确保输出文件命名符合预期
内容的提问来源于stack exchange,提问作者JVGen
相关产品推荐
相关产品推荐

