[20191021]數值累加的各種方法.txt

lfree發表於2019-10-21

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章