如何基于表格唯一组创建Slurm数组并传递对应文件名
问题根源
你的脚本中GRP被赋值为空格分隔的字符串,而非Bash数组。当你用${GRP[$SLURM_ARRAY_TASK_ID]}访问时,实际上是取字符串的第N个字符(而非完整组名),导致后续awk匹配不到对应组,所以INPUT无输出。
修正方案
将GRP定义为Bash数组,确保每个元素对应一个唯一组名,这样索引访问就能拿到正确的组名:
#!/bin/bash #SBATCH --array=0-2 #SBATCH -N 1 #SBATCH -c 8 #SBATCH -t 1- # 将唯一组名存入Bash数组 GRP=($(awk '{print $1}' table.txt | uniq)) # 打印所有组名(可选,用于验证) echo "所有组: ${GRP[@]}" # 根据数组任务ID获取对应组名 XYZ=${GRP[$SLURM_ARRAY_TASK_ID]} echo "当前处理组: $XYZ" # 提取对应组的文件名列表 INPUT=$(awk -v x="$XYZ" '$1 == x {print $2}' table.txt) echo "对应文件: $INPUT"
优化建议(可选)
如果组的数量可能变化,避免手动修改--array范围,可以先计算组的数量再提交脚本:
- 先计算唯一组的数量:
NUM_GROUPS=$(awk '{print $1}' table.txt | uniq | wc -l)
- 动态指定数组范围提交:
sbatch --array=0-$((NUM_GROUPS-1)) your_script.sh
这样不管表格中有多少组,脚本都能自动适配数组任务数量。
内容的提问来源于stack exchange,提问作者user21058163
相关产品推荐
相关产品推荐

