我在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将用作后续作业的参数。
答案 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
项。