Bash 使用便携式批处理系统(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数组在不同的文件上使用相同的程序并行提交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

workdir="/user/test"

samtools sort` `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d'` > `find ${workdir}/*.bam | sed ${PBS_ARRAYID}'!d' | sed "s/.bam/.sorted.bam/"`
注:

  • files=(“$workdir”/*.bam)
    执行bash内部的glob(不需要
    ls
    ),并将该glob的结果存储在数组中以供重用
  • 数组是零索引的;因此,我们使用0-4而不是1-5
  • 使用命令替换--
    `…`
    $(…)
    --会带来巨大的性能开销,最好避免
  • 对脚本中的最后一个命令使用
    exec
    ,告诉shell解释器它可以用该命令替换自己,而不需要保留在内存中

感谢您的评论。我试图在我的问题中更加明确,并将ls替换为find(正如shellcheck工具所建议的那样)。在这种情况下,我不想使用for循环的原因是我在服务器上运行此脚本,PBS数组允许我在单独的CPU上作为单独的作业运行每个$PBS_ARRAYID。基本上,$PBS_ARRAYID在本例中假设整数为1到5,我可以用它们来处理5个不同的.txt文件。程序正常运行,如上图所示。我只是想学习如何在shell中更高效。谢谢非常优雅,非常感谢。我现在将努力了解更多关于你所说的理论!不幸的是,我的名声不允许我给你们投赞成票,但再次感谢你们!如果这解决了问题,您应该能够通过单击答案旁边的复选框将问题标记为已解决。(坦率地说,我认为您已将其编辑到足够高的质量水平,如果其他问题达到相同的标准,您不会长时间保持低声誉)。
#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"