Text-Processing

awk 十進制除法

  • April 22, 2022

我有一個包含值的文件,有些是整數,有些是小數

# 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   

與@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

我相信您的總和值已關閉,但您可以使用以下內容:

{
       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

引用自:https://unix.stackexchange.com/questions/699367