shell處理檔案,和lua計算求和
寫本篇文章的主要目的是為了把剛剛理解的知識進行系統的整理,以備以後的複習和學習。
要求:是使用mysql匯出一系列資料。把他們相同的key的值進行累加。mysql就不做介紹了。使用mysql得到的資料大概如下:
該資料存在檔案result中
id num
12345 12
23124 13
22345 14
543243 12
id num
12345 12
23124 13
22345 14
543243 12
具體資料就不展示了,屬於祕密,這些資料是我模擬得出的資料編的一個數據。仔細觀察資料,可以看出存在字元,也存在數字,我們需要的是數字,不是字元。觀察可見,數字的前6個字元是數字。例如第一行 12345 12
它的前6個元素是數字,而且前六個不會牽扯到後面num的值。
使用shell字串拼接,就可以把它分開,即使後面行的id有6個元素,那麼也不會把id和num改變。
好觀察完畢準備開工。
使用讀取檔案
if判斷的作用是去掉$line打印出來的id 和num的不符合的值。while read line do head=${line:0:6} #選取前6個元素 last=${line:6} #從第六個元素開始,之後的元素 if [[ $head -gt 0 && $last -gt 0 ]]; then echo -e "$head \c" echo $last fi done < ./file
shell中的if條件判斷語句,條件是需要被執行的,如果成功返回0,執行then之後的語句。如果在執行條件語句時不符合,則跳過
就像這個判斷一樣,如果切割出來的變數是id或者num,那麼就直接跳過。
這個資料處理就是這樣。本來想著使用shell單獨,去把這個條件實現,但是才疏學淺,剛剛接觸,好多不懂,最後採用lua和shell合作去搞定這個問題。
更改許可權後使用命令,./file.sh > tmp 把得到的資料重定向到tmp檔案中。去掉id和num的資料就是這樣。
補充一下:使用mysql匯出的資料,id和num之間竟然不是空格,原本想單純使用lua進行處理的,但是使用lua進行分割時候,我採用遇空格進行分割,如果有空格,就
分割。就可以將id和num分開,但是我使用空格分割時,出現了1234512 2312413 這樣的數字,這下就亂玩了。經過上面shell的處理,這樣資料中間就是空格了。
12345 12
23124 13
22345 14
543243 12
12345 12
23124 13
22345 14
543243 12
採用lua進行,讀取檔案io.open("./tmp", "r")
for line in file:lines() do
...
...
然後呼叫空格分割的函式。將得出的數進行賦於變數。
local item = split(line , " ")
這樣id和num的值就以table形式存在item中,item[1]=id, item[2] = num
在這我說下,分割函式:
使用string.find(string, separator, index)查詢分隔符位置,引數分別是,字串, 分隔符, 下標(返回的item這個table的下標)。
然後使用string.sub(strin, index, len)切割
這個函式,知道了位置,和可以進行切割了。
建立迴圈,以此進行。
這個分隔函式,網上很多寫好的函式,直接拿來用就可以。
還有一個問題,就是在構建新的陣列時候。出現了問題。
tbl[item[1]] = tbl[item[1]] or 0 + item[2]
這樣寫的竟然最後結果沒有對。 這個讓我很頭疼。然後又採用了下面的方法
tbl[item[1]] = tbl[item[1]] or 0
tbl[item[1]] = tbl[item[1]] + item[2]
這樣卻是對的,這個。。。。。。。。。
你懂的話,就告訴我吧,我還沒有查出問題。
最後使用迴圈輸出就好了。
lua sum_num.lua > sum.csv
好了,匯出sum.csv檔案就可以看了。
這次總的來說,收穫還算不小,至少解決了些問題,學到了些知識。好了,就記到這裡