0

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

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

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

4

1 回答 1

2

你只需要一点模块化的划分。在 Ruby 中对此的快速模拟是:

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

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

这是在 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 作为数组的名称,但您显然可以替换它。祝你好运!

于 2012-04-22T18:53:46.970 回答