我有15个文件夹,每个文件夹都包含* .gz文件。我想使用该文件为其中一个包进行一些过滤。 为此,我想写一些可以打开该文件夹并读取该特定文件并执行上述操作的内容,然后将结果保存在具有不同扩展名的相同文件夹中。
我做的是(PBS脚本):
#!/bin/bash
#PBS -N Trimmomatics_filtering
#PBS -l nodes=1:ppn=8
#PBS -l walltime=04:00:00
#PBS -l vmem=23gb
#PBS -q ext_chem_guest
# Go to the Trimmomatics directory
cd /home/tb44227/bioinfo_packages/Trimmomatic/Trimmomatic-0.36
# Java module load
module load java/1.8.0-162
# Input File (I have a list of 15 folders and each contained fastq.gz file)
**inputFile= for f in /home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017/754_{1..15}/*fastq.gz; $f**
# Start the code to filter the file and save the results in the same folder where the input file is
java -jar trimmomatic-0.36.jar SE -threads ${PBS_NUM_PPN} -phred33 SLIDINGWINDOW:4:5 LEADING:5 TRAILING:5 MINLEN:17 $inputFile $outputFile
# Output File
outputFile=$inputFile{.TRIMMIMG}
我的问题是如何定义$ inputFile和$ outputfile以便它可以读取所有15个文件。
由于
答案 0 :(得分:0)
如果您的应用程序一次只处理一个输入文件,您有两个选择:
从用户的角度来看,您通常对第二个选项更感兴趣,因为如果有可用资源,多个作业可能会同时运行。但是,这取决于您需要处理的文件数量和系统使用策略,因为在很短的时间内发送太多作业会导致作业计划器出现问题。
第一种选择或多或少是你已经得到的。您可以使用find
程序和一个简单的bash循环。您基本上将find
输出存储到变量中,然后迭代它,就像在此示例中一样:
#!/bin/bash
# PBS job parameters
module load java
root_dir=/home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017
# Get all files to be processed
files=$(find $root_dir -type f -name "*fastq.gz")
for inputfile in $files; do
outputfile="$inputFile{.TRIMMIMG}"
# Process one file at a time
java -jar ... $inputfile $outputfile
done
然后,您只需提交您的工作脚本,这将生成一份工作。
$ qsub myjobscript.sh
第二个选项功能更强大,但要求您更改每个文件的jobscript。大多数作业管理员允许您通过标准输入传递作业脚本。这非常有用,因为它避免了我们生成污染您的目录的中间文件。
#!/bin/bash
function submit_job() {
# Submit job. Jobscript passed through standard input using a HEREDOC.
# Must define $inputfile and $outputfile before calling the function.
qsub - <<- EOF
# PBS job parameters
module load java
# Process a single file only
java -jar ... $inputfile $outputfile
EOF
}
root_dir=/home/tb44227/nobackup/small_RNAseq_260917/support.igatech.it/sequences-export/536-RNA-seq_Disco_TuDO/delivery_25092017
# Get all files to be processed
files=$(find $root_dir -type f -name "*fastq.gz")
for inputfile in $files; do
outputfile="$inputFile{.TRIMMIMG}"
submit_job
done
由于您在脚本中调用qsub,因此您只需调用脚本本身,就像任何常规shell脚本文件一样。
$ bash multijobscript.sh