bc를 사용하여 루프에서 두 값을 나누려고 하는데 그 값을 변수로 설정했습니다. 내 문제는 값에 소수점 이하 2자리가 있기를 원하지만 변수 내부에 정의할 때 scale=2가 제대로 작동하도록 할 수 없다는 것입니다.
이것은 내 테스트 파일입니다.
cat file.txt
Sc0000000_hap1 0 1200 32939
Sc0000000_hap1 1199 2388 28521
Sc0000001_hap1 0 1200 540
이것은 내가 실행 중인 루프입니다.
while read name start stop sum; do
divisor=`expr ${stop} - ${start}`
avg=`scale=2; expr $sum / $divisor | bc ` #I want 2 decimal points here
echo ${name} ${start} ${stop} ${avg} >> ${outfile}
done < file.txt
이것은 내가 얻는 결과입니다.
Sc0000000_hap1 0 1200 27
Sc0000000_hap1 1199 2388 23
Sc0000001_hap1 0 1200 0
이것이 내가 원하는 결과입니다:
Sc0000000_hap1 0 1200 27.45
Sc0000000_hap1 1199 2388 23.99
Sc0000001_hap1 0 1200 0.43
몇 가지 구문 변형을 시도했지만 제대로 작동하지 않는 것 같습니다. 누군가 이것을 올바르게 코딩하는 방법을 말해 줄 수 있습니까? 미리 감사드립니다.
답변1
avg=`scale=2; expr $sum / $divisor | bc `
누구세요
- 설정하다껍데기변수
scale
는 2 - 계산하다정수해당 값을 사용하여
expr
해당 값을 나누고 전달합니다bc
(읽기man expr
). - bc는 계산을 수행하지 않고 입력된 숫자만 출력합니다.
bc
작업을 수행해 봅시다 :
avg=$(echo "scale=2; $sum / ($stop - $start)" | bc)
이제 bc가 전체 계산을 완료하기 시작합니다.기원전척도변수.
중괄호는 큰따옴표와 다릅니다. 사용:
echo "${name} ${start} ${stop} ${avg}" >> ${outfile}
$(...)
대신 사용`...`