Bash 将var中定义的值尽可能均匀地划分到可变长度数组中

Bash 将var中定义的值尽可能均匀地划分到可变长度数组中,bash,awk,sed,Bash,Awk,Sed,我试图尽可能平均地分割余数,因为var不能被整除到数组计数中 我尝试了下面的方法,它将我四舍五入地拆分为数组项。我正在寻找一种方法来识别余数,然后将其尽可能均匀地分割到每个数组索引值中 for n in ${!variableLengthArray[@]} ; do divideCount=$(( ${variableLengthArray[$n]} / $var )) variableLengthArray[$n]=$(echo "($divideC

我试图尽可能平均地分割余数,因为var不能被整除到数组计数中

我尝试了下面的方法,它将我四舍五入地拆分为数组项。我正在寻找一种方法来识别余数,然后将其尽可能均匀地分割到每个数组索引值中

    for n in ${!variableLengthArray[@]} ; do

        divideCount=$(( ${variableLengthArray[$n]} / $var ))

        variableLengthArray[$n]=$(echo "($divideCount+0.5)/1" | bc )

    done
例1:

输入:

    var=11
    variableLengthArray[0]=0
    variableLengthArray[1]=0
    variableLengthArray[2]=0
    var=33
    variableLengthArray[0]=0
    variableLengthArray[1]=0
    variableLengthArray[2]=0
    variableLengthArray[3]=0
    variableLengthArray[4]=0
    variableLengthArray[5]=0
理想输出:

    variableLengthArray[0]=4
    variableLengthArray[1]=4
    variableLengthArray[2]=3
    variableLengthArray[0]=6
    variableLengthArray[1]=6
    variableLengthArray[2]=6
    variableLengthArray[3]=5
    variableLengthArray[4]=5
    variableLengthArray[5]=5
例2:

输入:

    var=11
    variableLengthArray[0]=0
    variableLengthArray[1]=0
    variableLengthArray[2]=0
    var=33
    variableLengthArray[0]=0
    variableLengthArray[1]=0
    variableLengthArray[2]=0
    variableLengthArray[3]=0
    variableLengthArray[4]=0
    variableLengthArray[5]=0
理想输出:

    variableLengthArray[0]=4
    variableLengthArray[1]=4
    variableLengthArray[2]=3
    variableLengthArray[0]=6
    variableLengthArray[1]=6
    variableLengthArray[2]=6
    variableLengthArray[3]=5
    variableLengthArray[4]=5
    variableLengthArray[5]=5

您只需要将输入除以输出插槽的数量。shell只进行整数除法,因此您可以将结果作为存储在每个插槽中的数字。除法的剩余部分告诉您有多少个插槽得到结果加上一

作为具体的例子,

$ var=11
$ slots=3
$ result=$((var / slots))
$ k=$((var % slots ))
$ for ((i=0; i<k; i++)); do
> variableLengthArray[i]=$(( result + 1 ))
> done
$ for ((i=k; i < slots; i++)); do
> variableLengthArray[i]=$result
> done
$var=11
$slots=3
$result=$((变量/插槽))
$k=$((变量%slots))
$for((i=0;i variableLengthArray[i]=$(结果+1))
>完成
$for((i=k;ivariableLengthArray[i]=$result
>完成

您只需将输入除以输出插槽的数量。shell只进行整数除法,因此结果将是存储在每个插槽中的数字。除法的剩余部分告诉您有多少插槽获得结果加上一

作为具体的例子,

$ var=11
$ slots=3
$ result=$((var / slots))
$ k=$((var % slots ))
$ for ((i=0; i<k; i++)); do
> variableLengthArray[i]=$(( result + 1 ))
> done
$ for ((i=k; i < slots; i++)); do
> variableLengthArray[i]=$result
> done
$var=11
$slots=3
$result=$((变量/插槽))
$k=$((变量%slots))
$for((i=0;i variableLengthArray[i]=$(结果+1))
>完成
$for((i=k;ivariableLengthArray[i]=$result
>完成

假设数组变量的索引从0开始,并且是连续的,则以下代码将执行您想要的操作:

n=${#variableLengthArray[@]}
ratio=$(($var / $n))
rem=$(($var % $n))
for i in ${!variableLengthArray[@]} ; do
    variableLengthArray[$i]=$(( $ratio + ($i < $rem ? 1 : 0) ))
done
n=${#variableLengthArray[@]}
比率=$($var/$n))
rem=$($var%$n))
对于${!variableLengthArray[@]};do中的i
可变长度阵列[$i]=$($ratio+($i<$rem?1:0)))
完成

假设数组变量的索引从0开始,并且是连续的,则以下代码将执行您想要的操作:

n=${#variableLengthArray[@]}
ratio=$(($var / $n))
rem=$(($var % $n))
for i in ${!variableLengthArray[@]} ; do
    variableLengthArray[$i]=$(( $ratio + ($i < $rem ? 1 : 0) ))
done
n=${#variableLengthArray[@]}
比率=$($var/$n))
rem=$($var%$n))
对于${!variableLengthArray[@]};do中的i
可变长度阵列[$i]=$($ratio+($i<$rem?1:0)))
完成

我不妨第一个说出来……你尝试过什么?(作为奖励,如果你能定义“尽可能均匀”,那就太好了。)对你的“规则”的一些口头描述可能有助于减少这个Q的歧义。我看到4个输入和3个输出。“平均分配”对我来说,这意味着2个输出。同样,6个输入和6个输出,而不是3个?第一行输入,即
var=33
是输入的一部分(但不是输出),或者,在您的问题背景下,这意味着什么?很抱歉,请查看更改并感谢反馈我可能是第一个这么说的…您尝试了什么?(作为奖励,如果你能定义“尽可能均匀”,那就太好了。)对你的“规则”的一些口头描述可能有助于减少这个Q的歧义。我看到4个输入和3个输出。“均匀分布”对我来说,这意味着2个输出。同样,6个输入和6个输出,而不是3?第一行输入,即
var=33
是输入的一部分(但不是输出),或者,在您的问题背景下,这意味着什么?很抱歉,请查看更改并感谢反馈