Bash 使用便携式批处理系统(PBS)阵列同时处理不同的文件
我正在尝试使用PBS数组在不同的文件上使用相同的程序并行提交5个作业。PBS将启动脚本的五个不同副本,每个副本在Bash 使用便携式批处理系统(PBS)阵列同时处理不同的文件,bash,shell,pbs,Bash,Shell,Pbs,我正在尝试使用PBS数组在不同的文件上使用相同的程序并行提交5个作业。PBS将启动脚本的五个不同副本,每个副本在PBS_ARRAYID变量中具有不同的整数。脚本将使用以下命令运行:qsub script.pbs 我现在的代码如下;虽然它按原样工作,但它在每个批处理过程中多次计算文件列表。有没有更有效的方法 #PBS -S /bin/bash #PBS -t 1-5 #Makes the $PBS_ARRAYID have the integer values 1-5 #PBS -V
PBS_ARRAYID
变量中具有不同的整数。脚本将使用以下命令运行:qsub script.pbs
我现在的代码如下;虽然它按原样工作,但它在每个批处理过程中多次计算文件列表。有没有更有效的方法
#PBS -S /bin/bash
#PBS -t 1-5 #Makes the $PBS_ARRAYID have the integer values 1-5
#PBS -V
workdir="/user/test"
samtools sort` `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d'` > `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d' | sed "s/.bam/.sorted.bam/"`
注:
执行bash内部的glob(不需要files=(“$workdir”/*.bam)
),并将该glob的结果存储在数组中以供重用ls
- 数组是零索引的;因此,我们使用0-4而不是1-5
- 使用命令替换--
或`…`
--会带来巨大的性能开销,最好避免$(…)
- 对脚本中的最后一个命令使用
,告诉shell解释器它可以用该命令替换自己,而不需要保留在内存中exec
#PBS -S /bin/bash
#PBS -t 0-4 #Makes the $PBS_ARRAYID have the integer values 0-4
#PBS -V
workdir="/user/test"
files=( "$workdir"/*.bam ) # Expand the glob, store it in an array
infile="${files[$PBS_ARRAYID]}" # Pick one item from that array
exec samtools sort "$infile" >"${infile%.bam}.sorted.bam"