#!/bin/bash
q=$(bc <<< "scale=2;$p*100")
head -n$q numbers.txt > secondcoordinate.txt
이는 대본의 일부일 뿐이지만, 제 의도를 설명하기에는 충분하다고 생각합니다. p
는 소수점 이하 두 자리만 있는 변수이므로 q
정수여야 하는데... 예를 들어 대신 bc
표시됩니다 .10.00
10
이 문제를 어떻게 해결할 수 있나요?
답변1
scale=0
규모가 결정되는 방식 때문에 명백한 내용으로는 이를 수행할 수 없습니다.
문서에서는 1로 나누는 것만으로도 출력을 match 로 재설정하기에 충분하며 scale
기본값은 0이라고 간접적으로 설명합니다.
식1/식2표현식의 결과는 두 표현식의 몫입니다. 결과의 척도는 변수 척도의 값입니다.
p=12.34; echo "($p*100)" | bc
1234.00
p=12.34; echo "($p*100)/1" | bc
1234
bc
귀하의 버전이 이를 처리할 수 없는 경우 sed
대신 파이프하십시오.
p=12.34; echo "($p*100)" | bc | sed -E -e 's!(\.[0-9]*[1-9])0*$!\1!' -e 's!(\.0*)$!!'
1234
이 RE 쌍은 숫자의 소수 부분에서 후행 0을 제거합니다. 따라서 3.00은 3으로 줄어들고, 3.10은 3.1로 줄어들지만 300은 그대로 유지됩니다.
또는 먼저 사용 perl
하고 폐기합니다.bc
p=12.34; perl -e '$p = shift; print $p * 100, "\n"' "$p"
답변2
awk를 사용하여 값을 계산할 수 있습니다.
bash-3.2$ p=0.01
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
1
bash-3.2$ p=0.02
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2
bash-3.2$ p=0.022
bash-3.2$ q=$(awk -vp_val="$p" 'BEGIN{print p_val*100}')
bash-3.2$ echo $q
2.2
답변3
긴 이야기 짧게
당신에게는 많은 선택이 있습니다.기원전알려진 동작이 scale=0
항상 예상한 것과는 다르지만 해결 방법은 많습니다. 다음은 몇 가지입니다.
인쇄 기능
사용인쇄 기능출력을 정수로 제한합니다.
$ printf "%g\n" $(echo '12.34 * 100' | bc)
1234
BC와 나눗셈
지속하고 싶다면기원전크기를 조정하려면 크기를 0으로 지정해야 합니다.그리고눈금을 재설정하려면 1로 나눕니다. 이는 알려진 동작이지만 실제로 이유를 설명할 수는 없습니다.
$ echo '12.34 * 100 / 1' | scale=0 bc
1234
sed
불필요한 후행 문자를 제거하십시오.
$ echo '12.34 * 100' | bc | sed 's/\.00$//'
1234
세게 때리다
소수점 앞의 값을 반환하려면 중괄호 확장을 사용하세요.
$ p='12.34'; q=$(bc <<< "scale=2; $p*100"); echo ${q%%.00}
1234
답변4
이것은 후행 0을 제거하는 bash 함수입니다.
remove_trailing_zeroes()
{
declare -n n="$1"
# Prepend a 0 if number starts with a dot.
if [[ $n =~ ^[.] ]]; then
n="0$n"
fi
# Remove trailing zeroes
while [[ $n =~ [.].*0$ ]]; do
n="${n%0}"
done
# Remove trailing dot if any
if [[ $n =~ [.]$ ]]; then
n="${n%.}"
fi
}
그런 다음 다음과 같이 귀하의 경우에 사용할 수 있습니다.
q=$(bc <<< "scale=2;$p*100")
remove_trailing_zeroes q
head -n$q numbers.txt > secondcoordinate.txt