使用bash任意拆分数字串到固定数量的变量

时间:2017-01-27 20:17:24

标签: bash

我在bash中有一个包含3000个元素(不是连续的)的字符串,

sections='1 2 4 ... 3000'

我正在尝试将此字符串拆分为长度为n的x块。 我希望x通常在3-10之间。每个块可能不是 相同的长度。

每个块都是作业的输入。

关注https://unix.stackexchange.com/questions/122499/bash-split-a-list-of-files 并使用bash数组,我的第一次尝试看起来像这样:

#! /bin/bash

nArgs=10
nChunkSize=10

z="0 1 2 .. 1--"

zs=(${z// / })
echo ${zs[@]}

for i in $nArgs; do
  echo "Creating argument: "$i
  startItem=$i*$nChunkSize
  zArg[$i] = ${zs[@]:($startItem:$chunkSize}
done

echo "Resulting args"

for i in $nArgs; do
 echo "Argument"${zArgs[$1]}
done   

上述情况远非我害怕。关于$ {zs [@] :( $ startItem:$ chunkSize}语法的任何指针?

输入13个元素:

z='0 1 2 3 4 5 6 7 8 10 11 12 15'

nChunks = 3 和nArgs = 4 我想获得一个包含3个元素的数组,zs包含内容

zs[0] = '0 1 2 3'
zs[1] = '4 5 6 7'
zs[2] = '8 10 11 12 15'

每个zs将用作后续作业的参数。

1 个答案:

答案 0 :(得分:2)

首先注意:这是个坏主意。它不能与任意(非数字)内容一起可靠地工作,因为bash不支持嵌套数组。

output=( )

sections_str='1 2 4 5 6 7 8 9 10 11 12 13 14 15 16 3000'
batch_size=4
read -r -a sections <<<"$sections_str"
for ((i=0; i<${#sections[@]}; i+=batch_size)); do
  current_pieces=( "${sections[@]:i:batch_size}" )
  output+=( "${current_pieces[*]}" )
done

declare -p output # to view your output

注意:

  • zs=( $z )是错误的。例如,列表中的任何*都将替换为当前目录中的文件名列表。使用read -a以可靠的方式读入数组,而不依赖于IFS以外的shell配置(可以使用IFS=' ' read -r -a控制范围仅限于那一行。
  • ${array[@]:start:count}从位置count开始,从您的数组扩展到最多start项。