如何解决如何通过使用awk截断每个记录的小数位来求和float值?
在下面的示例中,当我执行awk sum时,它使用3个小数位给出和。
A|1.668
B|1.668
C|1.668
D|1.668
E|1.668
F|1.668
G|1.668
H|1.668
使用的脚本:
nawk -v x=2 -F '|' '{rows++; sum+=$x} END { printf ("%s|%0.2f\n",rows,sum) }' testfile.dat
以上脚本的输出为13.34(是13.344的截断值)
所需的输出是13.28(即8乘以1.66而不是1.668)
如何将小数点后的位相加?
编辑:
我尝试使用示例中给出的一些记录的实际值。该文件的值还包含2个小数位到10个小数位。
537.45
129.36
241.93
143.58
279.65
348.37
239.27
6561.52
6682.61
解决方法
这可能是您要尝试的操作:
for i in range(n-1):
print(doors[i],end = ' ')
print(doors[n-1],end = '\n')
或者使用gensub()使用GNU awk:
$ awk -v x=2 -F'|' '{sub(/.$/,"",$2); sum+=$2} END{printf "%d|%0.2f\n",NR,sum}' file
8|13.28
否则,请编辑您的问题以更好地解释您的要求,并添加一些更真实的示例输入/输出,而上述方法不适用于该输入/输出。
给出您的评论,您可能需要对数学进行字符串操作以避免任何浮点数学问题:
$ awk -v x=2 -F'|' '{sum+=gensub(/(\...).*$/,"\\1",1,$2)} END{printf "%d|%0.2f\n",sum}' file
8|13.28
,
另一种方法:
ng-packagr
,
另一个awk
:
awk -F '[|.]' '{sum+=sprintf("%s.%.2s",$2,$3)} END {print sum}' file
,
perl中的一种解决方案,使用精度在十进制后2位的浮点数。即使总和的有效位数超过正常浮点值所能容纳的位数,这也将给出正确的结果。有一些方法可以使用其他数学库来使其更快,请参见https://metacpan.org/pod/bignum#Math-Library。
scipy.signal.welch(temporal,axis=-1,return_onesided=False,nperseg=temporal.shape[0])
,
使用bc
进行精确计算,使用GNU sed
进行字符串处理:
sed -E 's/.*\|([0-9]*\.[0-9]{2}).*/\1/; H; $!d; g; s/.//; y/\n/+/' in.txt | bc
假定小数点后至少有两位数字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。