shell处理文件,和lua计算求和
2017-11-13 20:50
239 查看
写本篇文章的主要目的是为了把刚刚理解的知识进行系统的整理,以备以后的复习和学习。
要求:是使用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文件就可以看了。
这次总的来说,收获还算不小,至少解决了些问题,学到了些知识。好了,就记到这里
要求:是使用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文件就可以看了。
这次总的来说,收获还算不小,至少解决了些问题,学到了些知识。好了,就记到这里
相关文章推荐
- tcl脚本真的比shell脚本解析处理文件效率要高?
- 郁金香论坛_Lua 标准库 文件读写操作及 输入输出处理
- 一起学shell之(八-2)文件处理
- 一共81个,开源大数据处理工具汇总:查询引擎、流式计算、迭代计算、离线计算、键值存储、表格存储、文件存储、资源管理、日志收集系统、消息系统、分布式服务、集群管理、基础设施、搜索引擎、数据挖掘=监控
- shell文本处理——最基本方法压缩js文件
- Linux通过shell实现递归列目录及对文件的处理
- 利用shell计算find命令查出后的总文件大小
- shell处理—文件汇总到一个文件里,用sqlldr装入数据库这些文件数据都少一个字段而字段内容为这个文件的名字
- shell浅谈之六字符串和文件处理
- Linux编写shell文件之后的权限处理
- shell 对一个目录树的遍历及遍历文件处理
- Hadoop-- 海量文件的分布式计算处理方案
- Hadoop--海量文件的分布式计算处理方案
- pl脚本处理ns2的trace文件计算平均时延
- 使用Python处理目录(二):计算某个目录下特定文件类型中文件总行数
- shell对文件的处理。包括取交集、并集、去重等
- lua日志文件处理代码
- Lua读取和写入文件处理例子
- 基本的bash shell命令(文件以及目录处理)
- [shell]shell脚本-求和&参数处理等