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
(이것은 확장자가 GNU라고 가정합니다 bc
. print
)
사용 목적이 bc
임의의 정밀도를 원하는 경우 perl
의 bignum
모듈을 사용할 수 있습니다.
$ 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
임의의 정밀도가 필요하지 않은 경우 부동 소수점을 지원하는 셸(예: zsh, ksh93 또는 yash)로 전환하는 것이 더 쉽습니다.
array=(...)
예를 들어 또는 실제로 zsh에서 가져온 이 스크립트의 많은 구문은 {1..11}
몇 년 후 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