写本篇文章的主要目的是为了把刚刚理解的知识进行系统的整理,以备以后的复习和学习。
要求:是使用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文件就可以看了。
这次总的来说,收获还算不小,至少解决了些问题,学到了些知识。好了,就记到这里