首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >,让#SBATCH -数组读取txt文件的行数

,让#SBATCH -数组读取txt文件的行数
EN

Stack Overflow用户
提问于 2022-01-16 20:02:03
回答 2查看 482关注 0票数 1

我有下面的slurm脚本(script.sh),它将与#SBATCH --array=0-24并行运行在HPC 25作业上。每个作业将从file.txt中获取一个变量,并将其用作$VAR变量。

代码语言:javascript
复制
#!/bin/bash
#SBATCH --job-name test
#SBATCH --ntasks 4
#SBATCH --time 00-05:00
#SBATCH --output out
#SBATCH --error err
#SBATCH --array=0-24

readarray -t VARS < file.txt
VAR=${VARS[$SLURM_ARRAY_TASK_ID]}
export VAR

cat test_"$VAR".txt

在本例中,我知道通过执行wc -l file.txt来运行的作业数,它返回25。因此,file.txt的每一行都是要运行的作业。

有什么方法可以避免执行wc -l file.txt并使script.sh自动理解要运行的作业数量?

EN

回答 2

Stack Overflow用户

发布于 2022-01-17 11:55:39

您可以使用bash中的这里文档来实现这一点。例如,下面的脚本显示了一种可能的方法

代码语言:javascript
复制
#!/bin/bash

# Read number of lines in file supplied as argument
nline=$(wc -l $1 | awk '{print $1}')

# Create the Slurm script ($ used in script need to be escaped: \$)
sbatch <<EOF
#!/bin/bash
#SBATCH --job-name test
#SBATCH --ntasks 4
#SBATCH --time 00-05:00
#SBATCH --output out
#SBATCH --error err
#SBATCH --array=0-$(( nline - 1 ))

readarray -t VARS < $1
VAR=\${VARS[\$SLURM_ARRAY_TASK_ID]}
export VAR

bash my_script.sh
EOF

注意:变量是脚本的一部分,而不是设置的一部分(在本例中是:VARS和SLURM_ARRAY_TASK_ID) must have their $escaped (i.e.$`),否则包装bash脚本将试图解释它们。

如果此脚本保存在一个文件runarray.bash中,并且您的文件(每个子作业有一行)保存在file.txt中,则可以使用以下方式提交作业:

代码语言:javascript
复制
bash runarray.bash file.txt
票数 3
EN

Stack Overflow用户

发布于 2022-09-30 19:39:54

以下是@AndyT的答案的一个变体,我从一位同事那里学到了它,现在经常使用它(或它的一些变体)。

代码语言:javascript
复制
#!/bin/bash
#SBATCH --job-name test
#SBATCH --cpus-per-task 4
#SBATCH --time 00-05:00
#SBATCH --output out.%j.txt
#SBATCH --error err.%j.txt

# Get first arg from command line or error with message
ids_file=${1?ids file required as first argument}

# How many lines does that file have?
nline=$(wc -l $ids_file | awk '{print $1}')

if [[ "$SLURM_ARRAY_TASK_ID" == "" ]]; then
     # Relaunch this script as an array
     exec sbatch --array=1-$nline $0
fi

# Extract line from file corresponding to the current task
# (i.e. first task gets first line, second task gets 
# second line, etc.)
VAR=$( sed -n ${SLURM_ARRAY_TASK_ID}p $ids_file )

# Could also use readarray -O 1 -t VARS $ids_file, etc

echo $VAR
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70733720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档