ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [20191021]数值累加的各种方法.txt

[20191021]数值累加的各种方法.txt

原创 Linux操作系统 作者:lfree 时间:2019-10-21 20:36:02 0 删除 编辑

[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<r]srz1<rp'
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编程并不太讲究执行效率,有机会测试记录很多的情况,那种方式快一些.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2660877/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2514
  • 访问量
    6314588