Ubuntu 14.04.1 LTS 64비트 bash 명령 프롬프트에 다음 스크립트가 있습니다.
S=0.030
F=0.150
N=10
reso=20
DIFF=`echo "scale=3; $F - $S" | bc -l`
df=`echo "scale=3; $DIFF / $N" | bc -l`
is=`echo "scale=3; $S / $df" | bc -l`
if=`echo "scale=3; $F / $df" | bc -l`
cd wgdisp-out
for i in `seq 0 $N`
do
f=`echo "scale=3; $S + $i * $df" | bc -l | awk ' sub("\\.*0+$","") '`
#h5totxt hsli0$f.h5 | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200 | sed -n '/^[[:digit:]]/p' | cut -d , -f 1
echo $f
done
f를 로 표시하고 싶습니다 0.03, 0.042, 0.054, .... 0.138, 0.15
. 예를 들어 f가 파일 이름에 사용되기 때문에 이것이 중요합니다 hsli0.03.h5
. 누구든지 올바른 방향을 알려줄 수 있습니까? 나는 쉘의 산술에 익숙하지 않습니다.
편집하다: 다음 구성을 시도했지만 원하는 출력을 생성하지 못했고 크기 조정 옵션도 bc
작동하지 않는 것 같습니다.
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./' -e 's/$^\/0/./'`
편집 2: 작동하게 하려면 다음 단일 명령을 사용하십시오.
f=`echo "scale=3; $S + $i * $df" | bc | sed -e 's/^\./0./;s/[0]*$//g'`
답변1
는 제한하는 데 사용되는 특수 변수 bc
입니다 .scale
규모(쉼표 뒤의 자릿수) /
(나누기)와 같은 일부 연산자의 결과입니다. 표시된 숫자의 정밀도가 아니라 bc
계산에 사용됩니다.
예를 들어 에서 scale=1; 1/3
결과는 0.3
( 3/10
)로 와는 거리가 멀다 1/3
.
계산에는 큰 규모의 값을 사용해야 하며 표시될 때만 줄여야 합니다(예: scale
끝 부분에서 나누기).1
비교하다:
$ echo "scale=100; r=1/3*300; scale=3; r/1" | bc
99.999
그리고:
$ echo "scale=3; 1/3*300" | bc
99.900
나는 다음과 같이 쓸 것입니다 :
n=10
echo "
s = 0.030
f = 0.150
n = $n
r = 20
scale = 100
d = (f - s) / n
scale = 3
for (i = s; i <= f; i += d) i/1" |
bc |
sed 's/^\./0./;s/0*$//' |
while read f; do
h5totxt "hsli$f.h5" | harminv -vt 0.1 -w 2-3 -a 0.9 -f 200
done
답변2
Bash의 부동 소수점 지원은 매우 열악합니다. 그러나 다음을 계속 사용할 수 있습니다 printf
.
printf '%5.3f\n' $f
printf '%.3g\n' $f
앞에 0을 추가하려면 매개변수 확장을 사용할 수 있습니다.
f=${f/#./0.}
# if negative numbers are possible, too
f=${f/#-./-0.}