![使用 bc 进行 bash 数组乘法](https://linux22.com/image/230203/%E4%BD%BF%E7%94%A8%20bc%20%E8%BF%9B%E8%A1%8C%20bash%20%E6%95%B0%E7%BB%84%E4%B9%98%E6%B3%95.png)
我正在尝试将数组值与使用 bc 循环索引相乘得出的值相乘。
#!/bin/bash
n=10.0
bw=(1e-3 2.5e-4 1.11e-4 6.25e-5 4.0e-5 2.78e-5 2.04e-5 1.56e-5 1.29e-5 1.23e-5 1.0e-5)
for k in {1..11};do
a=$(echo "$n * $k" | bc)
echo "A is $a"
arn=${bw[k-1]}
echo "Arn is $arn"
b=$(echo "$arn * $a" | bc -l)
echo "b is $b"
#echo $a $b
done
我可以通过将数组值分配给循环内的新变量来回显数组值,但是当我使用它来乘以 时bc
,我得到了(standard_in) 1: syntax error
。我寻找线索并尝试了一些,但没有任何帮助。预期输出如下。
10 1.00E-02
20 5.00E-03
30 3.33E-03
40 2.50E-03
50 2.00E-03
60 1.67E-03
70 1.43E-03
80 1.25E-03
90 1.16E-03
100 1.23E-03
110 1.10E-03
非常感谢所有帮助。
答案1
for
用单个脚本替换 OP 的循环awk
:
awk -v n="$n" ' # assign awk variable "n" the value of OS variable "n"
{ k++ # increment counter (initially == 0)
printf "%s %0.2E\n",(k*n),($1*k*n) # print output
}
' < <(printf "%s\n" "${bw[@]}") # print each bw[] entry on a separate line
这会生成:
10 1.00E-02
20 5.00E-03
30 3.33E-03
40 2.50E-03
50 2.00E-03
60 1.67E-03
70 1.43E-03
80 1.25E-03
90 1.16E-03
100 1.23E-03
110 1.10E-03
答案2
bc
不支持科学记数法,但您可以替换e
为*10^
以获得结果。
$ printf 'print k+=10, " ", k*%s, "\n"\n' "${bw[@]/[eE]/*10^}" | bc -l
10 .01000000000000000000
20 .00500000000000000000
30 .00333000000000000000
40 .00250000000000000000
50 .00200000000000000000
60 .00166800000000000000
70 .00142800000000000000
80 .00124800000000000000
90 .00116100000000000000
100 .00123000000000000000
110 .00110000000000000000
(此处假设bc
其print
扩展名为 GNU)。
如果使用的目的bc
是您想要任意精度,您可以使用perl
'sbignum
模块:
$ perl -Mbignum -e 'for $i (@ARGV) {printf "%-3d %.2E\n", $k += 10, $i * $k}' -- "${bw[@]}"
10 1.00E-02
20 5.00E-03
30 3.33E-03
40 2.50E-03
50 2.00E-03
60 1.67E-03
70 1.43E-03
80 1.25E-03
90 1.16E-03
100 1.23E-03
110 1.10E-03
如果您不需要任意精度,那么切换到支持浮点的 shell(如 zsh、ksh93 或 yash)会更容易。
该脚本中的许多语法(例如array=(...)
或{1..11}
实际上来自 zsh),几年后被 bash 借用。
#! /bin/zsh -
bw=(
1e-3 2.5e-4 1.11e-4 6.25e-5
4.0e-5 2.78e-5 2.04e-5 1.56e-5
1.29e-5 1.23e-5 1.0e-5
)
k=0
for i ($bw) printf '%-3d %.2E\n' k+=10 'k*i'
答案3
bc
不支持科学格式。使用能做到这一点的东西。
例如,Perl:
a=$(perl -e "print $n * $k" )
arn=${bw[k-1]}
b=$(perl -e "printf '%.2E', $arn * $a")
echo $a $b
输出:
10 1.00E-02
20 5.00E-03
30 3.33E-03
40 2.50E-03
50 2.00E-03
60 1.67E-03
70 1.43E-03
80 1.25E-03
90 1.16E-03
100 1.23E-03
110 1.10E-03