如何用Bash实现两个数组对应元素的除法运算?
实现Bash数组对应元素的除法运算
我有两个数组:
x=(43035000 51065000 67085000 36770000 57165000 54335000 46590000 64410000 39295000 37210000 41800000) y=(397 420 349 300 387 417 365 567 321 314 341)
想要实现x数组第1个元素除以y数组第1个元素,第2个除以第2个,以此类推。
我尝试了这段代码:
for i in "${x[@]}"; do for j in "${y[@]}"; do awk "{print $i/$j}"; done; done
但运行后只依次列出了x和y的元素,没有得到除法结果:
43035000 51065000 67085000 36770000 57165000 54335000 46590000 64410000 39295000 37210000 41800000 397 420 349 300 387 417 365 567 321 314 341
请问怎么修改代码才能实现对应元素的除法?
问题根源
你写的嵌套循环会遍历x的每个元素,再遍历y的每个元素,相当于做了所有x元素和y元素的两两组合,完全不是对应位置的运算逻辑。另外,awk的写法存在语法错误:双引号里的$i会被Bash提前解析成变量,而非传给awk处理,而且单独调用awk每次只处理一个表达式,完全没必要用嵌套循环。
正确实现方案
方案1:Bash索引循环+bc浮点计算
通过数组索引直接访问对应位置的元素,用bc工具处理浮点运算(Bash本身仅支持整数运算):
x=(43035000 51065000 67085000 36770000 57165000 54335000 46590000 64410000 39295000 37210000 41800000) y=(397 420 349 300 387 417 365 567 321 314 341) for ((i=0; i<${#x[@]}; i++)); do # scale=2 表示保留2位小数,可按需调整 echo "scale=2; ${x[$i]} / ${y[$i]}" | bc done
方案2:awk一次性批量处理
把两个数组传给awk,通过split函数分割成awk内部数组,再按索引遍历计算:
x=(43035000 51065000 67085000 36770000 57165000 54335000 46590000 64410000 39295000 37210000 41800000) y=(397 420 349 300 387 417 365 567 321 314 341) awk -v x_str="${x[*]}" -v y_str="${y[*]}" ' BEGIN { split(x_str, x_arr, " ") split(y_str, y_arr, " ") for (idx in x_arr) { # %.2f 表示格式化输出2位小数,可按需调整 printf "%.2f\n", x_arr[idx]/y_arr[idx] } }'
方案3:纯Bash整数除法(仅保留整数结果)
如果只需要整数商,不需要小数部分,可以直接用Bash算术扩展:
x=(43035000 51065000 67085000 36770000 57165000 54335000 46590000 64410000 39295000 37210000 41800000) y=(397 420 349 300 387 417 365 567 321 314 341) for ((i=0; i<${#x[@]}; i++)); do echo $(( ${x[$i]} / ${y[$i]} )) done
注意:这种方式会自动舍去小数部分,只保留整数商。
内容的提问来源于stack exchange,提问作者Shaedeycool
相关产品推荐
相关产品推荐

