선행 0을 인쇄하려면 bc (1)을 어떻게 얻습니까?
Makefile에서 다음과 같은 작업을 수행합니다.
echo "0.1 + 0.1" | bc
(물론 실제 파일에서 숫자는 동적입니다)
그것은 인쇄 .2
하지만 인쇄 하고 싶습니다 0.2
.
의지하지 않고이 작업을 수행하고 sed
싶지만 bc
0을 인쇄하는 방법을 찾을 수없는 것 같습니다 . 아니면 bc
그냥 할 수 없습니까?
awk를 사용하여 형식을 지정할 수도 있습니다.
echo "0.1 + 0.1" | bc | awk '{printf "%f", $0}'
또는 awk 자체로 수학을 수행합니다.
echo "0.1 0.1" | awk '{printf "%f", $1 + $2}'
이것은 당신을 위해 일할 수 있습니다.
echo "x=0.1 + 0.1; if(x<1) print 0; x" | bc
소스를 빠르게 살펴본 후 ( bc_out_num()
1461 행 참조 ) 0
정수 부분이이면 행간 을 인쇄 하는 명확한 방법을 알 수 없습니다 0
. 내가 놓친 것이 아니라면이 동작은 명령 줄 플래그를 사용하여 변경할 수있는 매개 변수에 의존하지 않습니다.
짧은 대답 : 아니요 bc
. 원하는 방식으로 숫자 를 인쇄 할 수있는 방법이 없다고 생각 합니다.
sed
여전히을 사용하고 싶다면 사용 하는 데 잘못된 것이 없습니다 bc
. 다음은 IMHO, 그렇게 무시 무시하게 보이지 않습니다.
[me@home]$ echo "0.1 + 0.1" | bc | sed 's/^\./0./'
0.2
당신이 정말로 피하고 싶은 경우 sed
, 모두 eljunior의 및 choroba의 제안은 멋지다,하지만 그들은 0을 후행 피하기 위해 값에 의존하는 조정이 필요합니다. 그것은 당신에게 문제가 될 수도 있고 아닐 수도 있습니다.
문서에서 출력 형식에 대해 아무것도 찾을 수 없습니다. sed 대신 printf에 도달 할 수도 있습니다.
printf '%3.1f\n' $(bc<<<0.1+0.1)
$ bc -l <<< 'x=-1/2; if (length (x) == scale (x) && x != 0) { if (x < 0) print "-",0,-x else print 0,x } else print x'
이것은 순수 bc
합니다. 의 결과를 식의 length
와 비교하여 선행 0을 감지합니다 scale
. 양수와 음수 모두에서 작동합니다.
이것은 또한 음수를 처리합니다.
echo "0.1 - 0.3" | bc | sed -r 's/^(-?)\./\10./'
echo "$a / $b" | bc -l | sed -e 's/^-\./-0./' -e 's/^\./0./'
결과가 다음과 같은 모든 경우에 적용됩니다.
- "-.123"
- ".123"
- '-1.23'
- '1.23'
설명:
단지 시작 모든 것을 들어
-.
, 교체-.
로-0.
단지 시작 모든 것을 들어
.
, 교체.
로0.
양수의 경우 (문자열) 0을 인쇄하는 것처럼 간단 할 수 있습니다.
$ echo '"0";0.1+0.1' | bc
0.2
숫자가 1보다 크거나 같으면 0을 피하십시오.
$ echo 'x=0.1+0.1; if(x<1){"0"}; x' | bc
0.2
숫자가 음수이면 조금 더 복잡해집니다.
echo 'x= 0.3 - 0.5 ; s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1) {"0"};x' | bc
-0.2
함수를 정의하고 라이브러리에 추가 할 수 있습니다.
$ echo 'define leadzero(x){auto s;
s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
return(x)};
leadzero(2.1-12.4)' | bc
-10.3
$ echo 'define leadzero(x){auto s;
s=1;if(x<0){s=-1};x*=s;if(s<0){"-"};if(x<1){"0"};
return(x)};
leadzero(0.1-0.4)' | bc
-0.3
이것은 bc 만 사용하고 음수로 작동합니다.
bc <<< "x=-.1; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
시도해보십시오 :
for y in "0" "0.1" "-0.1" "1.1" "-1.1"; do
bc <<< "x=$y; if(x==0) print \"0.0\" else if(x>0 && x<1) print 0,x else if(x>-1 && x<0) print \"-0\",-x else print x";
echo;
done
아마도 bc
현대 시대를위한 최고의 "벤치 계산기"는 아닐 것입니다. 다른 언어는 더 많은 제어를 제공합니다. 다음은 선행 0으로 범위 (-1.0 .. + 1.0)의 값을 인쇄하는 작업 예제입니다. 이러한 예는 사용 bc
, AWK
하고 Python 3
.
#!/bin/bash
echo "using bc"
time for (( i=-2; i<=+2; i++ ))
{
echo $(bc<<<"scale=1; x=$i/2; if (x==0||x<=-1||x>=1) { print x } else { if (x<0) { print \"-0\";-x } else { print \"0\";x } } ")
}
echo
echo "using awk"
time for (( i=-2; i<=+2; i++ ))
{
echo $(echo|awk "{printf \"%.1f\",$i/2}")
}
echo
echo "using Python"
time for (( i=-2; i<=+2; i++ ))
{
echo $(python3<<<"print($i/2)")
}
Note that the Python version is about 10x slower, if that matters.
Building on potongs answer,
For fractional results:
echo "x=0.1 + 0.1; if(x<1 && x > 0) print 0; x" | bc -l
Note that negative results will not be displayed correctly. Aquarius Power has a solution for that.
ReferenceURL : https://stackoverflow.com/questions/8402181/how-do-i-get-bc1-to-print-the-leading-zero
'Program Tip' 카테고리의 다른 글
JDBC에서 트랜잭션을 시작하는 방법은 무엇입니까? (0) | 2020.12.15 |
---|---|
Visual Studio 2010-XAML 편집기가 매우 느림 (0) | 2020.12.15 |
JavaFX 주기적 백그라운드 작업 (0) | 2020.12.15 |
DateTime.Parse ( "2012-09-30T23 : 00 : 00.0000000Z")는 항상 DateTimeKind.Local로 변환됩니다. (0) | 2020.12.15 |
Popen.communicate ()가 'hi'대신 b'hi \ n '을 반환하는 이유는 무엇입니까? (0) | 2020.12.15 |