bc를 사용한 bash 배열 곱셈

bc를 사용한 bash 배열 곱셈

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

forOP의 루프를 단일 스크립트로 바꾸십시오 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임의의 정밀도를 원하는 경우 perlbignum모듈을 사용할 수 있습니다.

$ 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

관련 정보