计算模型运行的ID

时间:2012-04-22 18:38:24

标签: shell math pbs

我正在PBS系统上运行一些阵列作业(虽然希望不需要知道PBS系统来回答我的问题!)。我有24次运行,但我想将它们分成5个子作业,所以我需要运行我的脚本120次。

在给出-t 1-120的PBS选项后,我可以使用$PBS_ARRAYID获取当前的作业数组ID。但是,我想创建一些输出文件。如果这些输出文件只使用了24次运行时使用的ID,以及子运行标识符(例如output-1a.txt,output-1b.txt ... output-1e),那将是最好的。 txt,output-2a.txt)。

我需要的是一种计算获取ID(在1-24范围内)以及子运行标识符(可能在一组if语句中)的方法,这种方法可用于shell脚本。不幸的是,我的数学和Unix知识都不足以解决这个问题。我假设我需要根据相对于120或24的当前$PBS_ARRAYID的商/余数做一些事情,但这就是我所拥有的......

1 个答案:

答案 0 :(得分:2)

你只需要一个小模块化部门。在Ruby中快速模拟这个:

p = Array.new; (1..120).each {|i| p[i] = "Run #{1+(i/5)}-#{((i%5)+96).chr}" }

这说的只是运行应该从1开始并且在每个新的五个部分之后递增,并且尾随子运行应该是由96表示的ascii字符加上子运行的位置(例如, 97 =='a')。

这是在Bash:

#!/bin/bash

chr() {
  local tmp
  [ ${1} -lt 256 ] || return 1
  printf -v tmp '%03o' "$1"
  printf \\"$tmp"

}

for ((i = 0; i < ${#ARP[*]}; i++))
do
    charcode=$((($i % 5)+97))
    charachter=$(chr "$charcode")
    echo "Filename: output-$((($i/5)+1))$charachter"
done

我刚刚使用ARP作为数组的名称,但显然可以替代它。祝你好运!