使用 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'

n块=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 将用作后续作业的参数。

首先注意:这是一个坏主意。它不能可靠地处理任意(非数字)内容,因为 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}从位置 start 开始,从数组中扩展到最多 count 个项目。

最新更新