이상한 십진수 나누기

이상한 십진수 나누기

값이 포함된 파일이 있는데 일부는 정수이고 일부는 소수입니다.

# cat file    
value1 100
value2 500.10
value3 2505
value4 35.4

field2의 각 값을 고정된 숫자 = 1000으로 나누고 나눈 후 모든 값을 더하고 싶습니다. 결과 값에는 소수점 이하 5자리가 있어야 합니다.

# cat output.txt
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03450
sum   3140.50000 3.14050   

답변1

귀하의 합계 값이 꺼져 있다고 생각하지만 다음을 사용할 수 있습니다.

{
        div = $2 / 1000
        sum += $2
        divsum += div
        printf "%s %.5f\n", $0, div
}

END {
        printf "sum %.5f %.5f\n", sum, divsum
}

$ awk '{div=$2/1000;sum+=$2; divsum+=div; printf "%s %.5f\n", $0, div}END{printf "sum %.5f %.5f\n", sum, divsum}' file
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03540
sum 3140.50000 3.14050

답변2

기본적으로 같은 생각이에요@jesse_b의 답변, 그러나 중간 변수가 누락되었습니다.

$ awk '{ sum+=$2; dsum+=$3=$2/1000; print} END{print "sum",sum,dsum}' file 
value1 100 0.1
value2 500.10 0.5001
value3 2505 2.505
value4 35.4 0.0354
sum 3140.5 3.1405

printf더 정밀한 작업이 필요한 경우 다음을 사용할 수 있습니다.

$ awk '{ 
        sum+=$2; dsum+=$3=sprintf("%.5f",$2/1000); print 
    } 
    END{printf "%s%s%.5f%s%.5f\n", "sum",OFS,sum,OFS,dsum}' file 
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03540
sum 3140.50000 3.14050

재미로 Perl을 사용하는 방법은 다음과 같습니다.

$ perl -lane '$sum+=$F[1]; $dsum+=$F[2]=sprintf("%.5f",$F[1]/1000);
              print "@F"; }{ print "sum $sum $dsum"' file 
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03540
sum 3140.5 3.1405

그리고 좀 더 정확하게 말하자면:

$ perl -lane '$sum+=$F[1]; $dsum+=$F[2]=sprintf("%.5f",$F[1]/1000); 
              print "@F"; }{ 
              printf "sum %.5f %.5f\n", $sum, $dsum' file 
value1 100 0.10000
value2 500.10 0.50010
value3 2505 2.50500
value4 35.4 0.03540
sum 3140.50000 3.14050

답변3

GNU 데스크톱 계산기를 사용하는 한 가지 방법은 다음과 같습니다.직류, 명령줄 RpN 계산기.

sed -E 's/\S+/[&]/' file |
dc -e "
##> final sums displayed
[
  [Sum]nlyx
  lpd1/nlyx
  lzxq
]sq

##> output each line read
[
  rnlyx
  dd lp+sp nlyx
  lzx
]sa

##> main() to read , process, & print each lineread
[?z0=q lax cz0=?]s?

## > helper macros to pad leading zero for numbers < 1
[0n]s0 [9an]sy
[1000/ddZrX!<0p]sz

##> set precision and start
5kl?x
" - | column -ts$'\t'
value1  100         0.10000
value2  500.10      0.50010
value3  2505        2.50500
value4  35.4        0.03540
Sum     3140.50000  3.14050

관련 정보