使用配对的输入文件和多个输出文件编写一个bash或python for循环

时间:2018-01-24 19:13:27

标签: python bash for-loop

我正在研究一组用于分析RNA-seq数据的非常常见的命令。但是,由于这个问题不是生物信息学特有的,我选择在这里发布而不是BioStars等。

具体来说,我正在从成对的末端测序数据中修剪Illumina Truseq适配器。为此,我使用Trimmomatic 0.36。

我有两个输入文件:

S6D10MajUnt1-1217_S12_R1_001.fastq.gz
S6D10MajUnt1-1217_S12_R2_001.fastq.gz

该命令生成五个输出文件:

S6D10MajUnt1-1217_S12_R1_001.paired.fq.gz
S6D10MajUnt1-1217_S12_R1_001.unpaired.fq.gz
S6D10MajUnt1-1217_S12_R2_001.paired.fq.gz
S6D10MajUnt1-1217_S12_R2_001.unpaired.fq.gz
S6D10MajUnt1-1217_S12.trimlog

我正在尝试编写一个python或bash脚本,以递归方式循环文件夹的所有内容,并使用适当的文件和输出执行trim命令。

#!/bin/bash
for DR in *.fastq.gz
do
FL1=$(ls ~/home/path/to/files/${DR}*_R1_*.fastq.gz)
FL2=$(ls ~/home/path/to/files/${DR}*_R2_*.fastq.gz)
java -jar ~/data2/RJG_Seq/apps/Trimmomatic-0.36/trimmomatic-0.36.jar PE -threads 12 -phred33 -trimlog ~/data2/RJG_Seq/trimming/sample_folder/$FL1.trimlog ~/data2/RJG_Seq/demultiplexing/sample_folder/$FL1 ~/data2/RJG_Seq/demultiplexing/sample_folder/$FL2 ~/data2/RJG_Seq/trimming/sample_folder/$FL1.pair.fq.gz ~/data2/RJG_Seq/trimming/sample_folder/$FL1.unpair.fq.gz ~/data2/RJG_Seq/trimming/sample_folder/$FL2.pair.fq.gz ~/data2/RJG_Seq/trimming/sample_folder/$FL2.unpair.fq.gz ILLUMINACLIP:/media/RJG_Seq/apps/Trimmomatic-0.36/TruSeq3-PE.fa:2:30:10 LEADING:5 TRAILING:5 SLIDINGWINDOW:4:15 MINLEN:28
done

我认为我分配和调用FL1和FL2的方式有问题,最后我正在寻找帮助创建一个可执行的可执行命令trim-my-reads.py或trim-my-reads.sh修改为接受任意命名的输入R1.fastq.gz和R2.fastq.gz文件。

2 个答案:

答案 0 :(得分:1)

您可以编写一个简单的python脚本来遍历文件夹中的所有文件。

注意:我假设输出文件将在名为&#34的文件夹中生成;示例"

import glob
for file in glob.glob("*.fastq.gz"):
    #here you'll unzip the file to a folder assuming "example"
    for files in glob.glob("/example/*"):
        #here you can parse all the files inside the output folder

答案 1 :(得分:1)

每对样本都有一个匹配的字符串( SN =样本N)bash中这个问题的解决方案可能是:

#!/bin/bash
#apply loop function to samples 1-12
for SAMPLE in {1..12} 
do
#set input file 1 to "FL1", input file 2 to "FL2"
FL1=$(ls ~path/to/input/files/_S${SAMPLE}_*_R1_*.gz)
FL2=$(ls ~path/to/input/files/_S${SAMPLE}_*_R2_*.gz)

#invoke java ,send FL1 and FL2 to appropriate output folders
java -jar ~/path/to/trimming/apps/Trimmomatic-0.36/trimmomatic-0.36.jar PE
-threads 12 -phred33 -trimlog ~/path/to/output/folders/${FL1}.trimlog
~/path/to/input/file1/${FL1} ~/path/to/input/file2/${FL2} 
~/path/to/paired/output/folder/${FL1}.pair.fq.gz ~/path/to/unpaired/output/folder/${FL1}.unpair.fq.gz 
~/path/to/paired/output/folder/${FL2}.pair.fq.gz ~/path/to/unpaired/output/folder/${FL2}.unpair.fq.gz 
ILLUMINACLIP:/path/to/trimming/apps/Trimmomatic-0.36/TruSeq3-PE.fa:2:30:10 LEADING:5 TRAILING:5 SLIDINGWINDOW:4:15 MINLEN:28

#add verbose option to track progress
echo "Sample ${SAMPLE} done"
done

这是一个不优雅的解决方案,因为它需要我正在使用的格式。一个更好的方法是grep每个文件名并相应地将它们分配给FL1,FL2,因为这会推广该方法。尽管如此,这对我有用,并且我可以轻松控制哪些样本受到for循环的影响,只要我在文件名字符串中始终使用_S * _格式。