1. 程式人生 > >shell處理檔案,和lua計算求和

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改變。



好觀察完畢準備開工。

使用讀取檔案

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
if判斷的作用是去掉$line打印出來的id 和num的不符合的值。

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檔案就可以看了。



這次總的來說,收穫還算不小,至少解決了些問題,學到了些知識。好了,就記到這裡