【问题标题】:pbsnodes and bash string matchingpbsnodes 和 bash 字符串匹配
【发布时间】:2017-04-01 17:05:00
【问题描述】:

我有一个形式为“8, 14-24, 30-45, 9”的字符串,它是 pbsnodes 输出的子字符串。这显示了给定节点上正在使用的核心,其中 14-24 是正在使用的核心范围。

我想知道这个字符串中使用的内核总数,即 在本例中为 1 + (24 - 14 + 1) + (45 - 30 + 1 )+ 1,使用 bash 脚本。

非常感谢任何建议或帮助。

迈克尔

【问题讨论】:

  • 你是怎么解决这个问题的?
  • 不幸的是我的 bash 是有限的。我知道我想做什么:找到每个连字符,根据空格将 a 设置为前面的整数,将 b 设置为后面的整数。取 b-a-1 并将其添加到处理器计数中,然后从字符串中删除 ", a - b"。重复直到:“a,b,c”。将这些最终整数添加到计数中。 IFS as ":" 和 read 似乎很有用,但也许你有更好的建议?
  • Mike:这些都是很好的尝试,请通过这些努力更新问题

标签: string bash pbs


【解决方案1】:

您可以使用纯bash 技术来实现这一点。通过将字符串读取到数组并使用 $((..)) 运算符执行算术运算符。您可以直接在命令行上运行这些命令,

IFS=", " read -ra numArray <<<"8, 14-24, 30-45, 9"

unset count
for word in "${numArray[@]}"; do
   (( ${#word} == 1 )) && ((++count)) || count=$(( count +  ${word#*-} - ${word%-*} + 1  ))
done

printf "%s\n" "$count"

这个想法是

  • read-aIFS 设置的分隔符上的字符串拆分,并将其读入数组numArray
  • 每个元素的循环,对于每个元素,如果元素只是单个字符,只需将总计数增加1
  • 对于数字范围,进行操作,例如对于数字 a-b 使用 参数扩展 语法 ${word#*-}${word%-*} 分别提取 ba 并执行 b-a+1 并将其与已计算的 count 添加并打印循环后的元素

  • 您可以将其放入 bash 脚本中,并将 she-bang 设置为 #!/bin/bash,然后运行该脚本或直接从命令行运行

【讨论】:

  • 太棒了!谢谢!我马上就出去了,但很快就会去看看。
  • 就像一种享受。就我而言,小错误在于它应该是 b-a +1,而不是 -1。我在原始问题中对此进行了编辑。理想的堆栈溢出答案。
猜你喜欢
  • 2021-09-18
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多