You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:35:17