[20191028]数值累加的各种方法2.txt
--//前一阵子做了数值累加的测试,链接:http://blog.itpub.net/267265/viewspace-2660877/
--//当时的条件是每行1个数值的情况,如果存在多个数值的情况呢.继续测试.
$ cat -tv b.txt
301000.0000^I^I293000.0000
66000.0000 182000.0000^I98000.0000
252914.5300
235000.0000 300000.0000
330000.0000
--//^I表示<tab>
1.方法1使用awk:
$ awk '{for(i=1;i<=NF;i++) sum+=$i} END {printf("%.10f\n",sum)}' b.txt
2057914.5300000000
--//使用awk估计是最常用的方式.也是我不熟悉的方式.
--//awk还可以重新定义分隔符,我这里定义RS="[ \t\n]+",格式与正则表达式类似.
$ awk 'BEGIN{RS="[ \t\n]+"} {sum+=$1} END {printf("%.10f\n",sum)}' b.txt
2057914.5300000000
2.xargs方法,这个比较简单,不受1行多个数值的影响.
$ cat b.txt |xargs | sed 's/ /+/g' | bc
2057914.5300
$ cat b.txt |xargs | (sed -e 's/^/s+=/g' a.txt ; echo s ) | bc
2057914.5300
3.其它方法可以先转化为1行1个数值,然后累加.
$ cat b.txt | (tr '\n\t\r\ ' '+' ; echo 0 ) | sed 's/+\+/+/g' | bc
2057914.5300
$ (cat b.txt |xargs -n 1 | sed -e 's/^/s+=/g' ;echo s ) | bc
2057914.5300
$ cat b.txt |xargs -n 1 | paste -sd+ | bc
2057914.5300
4.使用dc计算器:
--//bing检索,找到一个不用计算输入多少加号的方法.
$ cat b.txt | dc -f - -e '[+z1<r]srz1<rp'
2057914.5300
--//-e后面那一串什么意思,即使看了man dc文档,我也没看懂表示什么意思.
--//一般bash编程并不太讲究执行效率,有机会测试记录很多的情况,那种方式快一些.
--//也许还有许多方法.不在一一列举.有机会测试大量数据的情况.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/267265/viewspace-2661719/ ,如需转载,请注明出处,否则将追究法律责任。