我有一个包含值的文件,有些是整数,有些是小数
# 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