如何在Bash中新增數字列?
概述
本文探討如何在bash shell中對數字列資料進行求和,探討可用於此任務的bash工具並比較它們的執行速度。
使用awk工具
我們將首先使用awk程式計算特定列中值的總和。
$ awk '{Total=Total+$1} END{print "Total is: " Total}' numbers.csv
Total is: 49471228
現在讓我們使用“time”命令檢視計時結果 -
$ time awk '{Total=Total+$1} END{print "Total is: " Total}' numbers.csv
Total is: 49471228
real 0m0.228s
user 0m0.141s
sys 0m0.047s
檔案包含多列時
我們已經瞭解瞭如何使用awk計算檔案一行中的總和。現在讓我們看看如何計算檔案多行中的總和。
$ cat prices.csv Books,40 Bag,70 Dress,80 Box,10
這裡,檔案price.csv有兩列。我們現在想要計算第二列的值的總和。
$ awk -F "," '{Total=Total+$2} END{print "Total is: " Total}' prices.csv
Total is: 200
檔案包含標題行時
有時,文字或CSV檔案標題還包含一行列名。我們將使用這些列名來幫助我們理解檔案的內容。讓我們編輯我們的prices.csv檔案並在頂部新增新的一行 -
$ cat prices.csv Item,Value Books,40 Bag,70 Dress,80 Box,10
如果檔案包含標題,則需要在文字處理之前刪除標題。首先,讓我們向輸入資料集新增一個名為“title”的附加欄位。然後,我們將編寫一個指令碼,讀取檔案中的每個記錄並將新欄位的值新增到總計中。最後,我們將打印出結果。
$ awk -F "," 'NR!=1{Total=Total+$2} END{print "Total is: " Total}' prices.csv
Total is: 200
然後,我們將研究一些其他在列中新增數字的方法,並檢視awk方法與它們的比較。
使用Bash迴圈迭代
Awk是一個強大的工具,但我們也可以使用for迴圈來迭代我們列中的每個值。
使用expr命令
我們將進行一個實驗,看看我們是否可以使用expr函式計算for迴圈中數字的總和。
$ time (sum=0;for number in `cat numbers.csv`; do sum=`expr $sum + $number`; done; echo "Total is: $sum") Total is: 49471228 real 212m48.418s user 7m19.375s sys 145m48.203s
使用算術擴充套件
由於使用“expand”並沒有多大幫助,我們將嘗試使用算術表示式另一種方法 -
$ time (sum=0;for number in `cat numbers.csv`; do sum=$((sum+number)); done; echo "Total is: $sum") Total is: 49471228 real 0m1.961s user 0m1.813s sys 0m0.125s
為了計算總和,我們將使用算術運算子。與expr運算子不同,$(...)運算子可以同時處理整數和浮點數。
使用bc命令新增值
bc命令對由多行組成的表示式進行計算。因此,我們將必須將數字連線到一行中,用加法運算子分隔它們。然後,我們將結果字串傳遞給bc以執行計算。以下是一些方法。
使用Paste命令
首先,我們將檢視“PASET”命令,以便在一行上排列資料集的前十個數字。
$ cat numbers.csv| head -10 | paste -sd+ - 2+44+6+15+23+0+15+88+82+1
–s選項確保paste將每個條目列印在其自己的行上。我們還使用+d選項新增“+”符號作為每個條目之間的分隔符。
現在我們已經介紹了基礎知識,讓我們繼續將輸入提供給bc命令。
$ time echo "Total is: $(cat numbers.csv | paste -sd+ - | bc)" Total is: 49471228 real 0m0.244s user 0m0.203s sys 0m0.063s
使用tr命令
讓我們再次使用tr(轉錄)函式從現有字串建立一個新字串。
$ cat numbers.csv | head -10 |tr "
" "+" 2+44+6+15+23+0+15+88+82+1+
我們在字串的開頭添加了一個額外的零,以便我們可以使用bc命令進行加法。但是,請注意字串末尾的額外“+”。為了解決這個問題,我們可以在行的末尾簡單地附加另一個零。
$ cat numbers.csv | head -10 |tr "
" "+" ; echo "0" 2+44+6+15+23+0+15+88+82+1+0
讓我們將前一個命令的結果重定向到bc命令。
$ time ((cat numbers.csv | tr "
" "+" ; echo "0") | bc) 49471228 real 0m0.217s user 0m0.203s sys 0m0.031s
組合tr和bc命令的執行速度比使用awk快。
使用sed命令
我們最終將使用sed命令來生成我們的序列。
$ cat numbers.csv | head -10 | sed -z 's#
#+#g' 2+44+6+15+23+0+15+88+82+1+
我們使用sed命令的搜尋和替換選項將換行符("
")替換為加號(“+”)運算子,並在末尾列印零以處理額外的加號運算子。
$ time ((cat numbers.csv | sed -z 's#
#+#g' ; echo "0") | bc) 49471228 real 0m0.343s user 0m0.281s sys 0m0.109s
要更改換行的含義,請使用“–z”選項。它們將不再被解釋為每個輸入的開始,而是將被視為空字元。因此,如果我們將換行符替換為加號(+),則我們將得到以下輸出 -
如果您正在處理大量文字,則可能需要使用sed而不是tr。
結論
我們研究了在bash shell中新增數字列的不同方法。
我們首先討論了awk命令的使用。然後,我們討論瞭如何處理包含多列或單個帶標題列的檔案。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP