如何在LSF平台使用${LSB_JOB_INDEX}将循环转换为数组任务
LSF数组任务改造:替换for循环实现并行处理
原脚本的问题在于:每个数组任务(共100个)都会完整执行一遍for循环,导致所有bam文件被重复处理100次,完全没达到并行处理单个文件的目的。正确的做法是让每个数组任务对应处理一个bam文件,用${LSB_JOB_INDEX}来定位当前任务要处理的文件,改造后的脚本如下:
#!/bin/bash #BSUB -J My_array[1-100] # 这里的100要改成你实际的bam文件数量,避免空任务 #BSUB -n 3 # 每个任务用3核 #BSUB -R span[ptile=1] #BSUB -W 00:10 # 单任务时限10分钟 ###BSUB -q queuename # 按需指定队列 #BSUB -o Output_%J_%I.out # 输出文件包含任务ID和数组索引 #BSUB -e Error_%J_%I.err # 错误日志同理 path=./home/ # 把所有bam文件存入数组 bam_files=(*.bam) # LSF数组索引从1开始,bash数组下标从0开始,所以要减1 current_bam=${bam_files[$((LSB_JOB_INDEX - 1))]} # 对单个文件执行处理命令 samtools coverage ${current_bam} -o ${current_bam}_coverage.txt
关键改动说明:
- 数组存储bam文件:
bam_files=(*.bam)会把当前目录下所有.bam文件按顺序存入数组,每个元素对应一个文件。 - 用LSB_JOB_INDEX定位文件:
$((LSB_JOB_INDEX - 1))转换索引,让第1个数组任务处理数组第0个元素(第一个bam文件),以此类推。 - 去掉全局for循环:每个任务只处理自己对应的单个文件,避免重复执行。
注意事项:
- 一定要把
#BSUB -J My_array[1-100]里的100改成你实际的bam文件数量,比如有87个bam文件就改成[1-87],否则会出现空任务(索引超过文件数时)或者遗漏文件。 - 如果bam文件不在当前脚本执行目录,要先cd到目标目录,或者在
*.bam前加上完整路径,比如bam_files=(${path}*.bam)。
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

