[20191021]数值累加的各种方法.txt
--//前几天跟别人的聊天,提及前一阵子给别人出的面试题.
--//给出一个文本都是数字,每行1个数值.计算累加结果.结果对方提及大部分人都没有做出来.
--//仅仅一个给出一个方法就是导入数据库,然后计算(dba的思维方式),可能是太紧张,上机没有做出来.
--//当然如果能上网,我估计大部分人都可以做出来.
--//实际上方法很多,我个人的要求是你最后算出来就可以了.做一个例子测试看看.
$ cat a.txt
301000.0000
293000.0000
66000.0000
182000.0000
98000.0000
252914.5300
235000.0000
300000.0000
330000.0000
1.方法1使用awk:
$ awk '{sum+=$1} END {printf("%.10f\n",sum)}' a.txt
2057914.5300000000
--//使用awk估计是最常用的方式.也是我不熟悉的方式.
2.使用paste+bc:
$ paste -sd+ a.txt | bc
2057914.5300
--//利用paste -s功能,不过手册提示-s的功能是
--//-s, --serial paste one file at a time instead of in parallel,有点不是很理解.
3.实际上方法还很多:
$ cat a.txt |xargs | sed 's/ /+/g' | bc
2057914.5300
$ cat a.txt | (tr '\n' '+' ; echo 0 ) | bc
2057914.5300
$ (sed -e 's/^/s+=/g' a.txt ; echo s ) | bc
2057914.5300
--//这种方式我估计效率很低,如果记录很多的情况下.但是好处就是如果记录不多还是不错的,不会出现输入缓存溢出的情况..
--//而前面的方式如果记录很多,会出现输入缓存溢出的情况,执行时会报错.例子:
$ seq 1000 | paste -sd+ | bc
500500
$ seq 10000 | paste -sd+ | bc
(standard_in) 1: Function too big.
4.使用dc计算器:
--//dc计算器采用压栈出栈方式,也就是后缀方式.例子:
$ echo 1 2 + pq | dc
3
--//本例子使用dc的难点是需要输出多少+.
$ (cat a.txt ; seq $(($(cat a.txt |wc -l ) -1 ))|xargs -I {} echo '+' ;echo pq ) | dc
2057914.5300
--//bing检索,找到一个不用计算输入多少加号的方法.
$ cat a.txt | dc -f - -e '[+z1
2057914.5300
--//-e后面那一串什么意思,即使看了man dc文档,我也没看懂表示什么意思.
5.测试导入数据库的方式:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.2.0.1.0 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
SCOTT@test01p> create table tt ( a number);
Table created.
$ cat a.txt | xargs -I {} echo insert into tt values ({})
$ cat a.txt | xargs -I {} echo "insert into tt values ( {} ) " | sqlplus -s -l scott/btbtms@test01p
...
SCOTT@test01p> select sum(a) from tt;
SUM(A)
----------
2057914.53
--//理论讲这么不算一种方法.也可以使用sqlldr导入.不过有点奇怪的是windows下cvs文件格式必须是dos的.
--//不然导入报错.
$ cp a.txt tt.dat
--//修改文件tt.dat格式为dos,导入:
D:\tools\cygwin64\home\Administrator\test> sqlldr scott/btbtms@test01p table=tt
sqlldr scott/btbtms@test01p table=tt
SQL*Loader: Release 12.2.0.1.0 - Production on Mon Oct 21 20:24:57 2019
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Express Mode Load, Table: TT
Path used: External Table, DEGREE_OF_PARALLELISM=AUTO
Table TT:
9 Rows successfully loaded.
Check the log files:
tt.log
tt_%p.log_xt
for more information about the load.
$ sqlplus -s -l scott/btbtms@test01p <<< "select sum(a) from tt;"
SUM(A)
----------
2057914.53
--//一般bash编程并不太讲究执行效率,有机会测试记录很多的情况,那种方式快一些.