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

lfree發表於2019-10-28

[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部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2661719/,如需轉載,請註明出處,否則將追究法律責任。

相關文章