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文件就可以看了。



这次总的来说,收获还算不小,至少解决了些问题,学到了些知识。好了,就记到这里



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值