您的位置:首页 > 运维架构 > Shell

shell处理

2016-01-19 20:24 351 查看
今天老大让我帮消费的数据,然后花了特别久的时间。其实就从mysql中查数据而言并没有什么难点。但是由于这些uid(几千个)并不是所有都有消费的。有的sql查出来是空,这样就有可能不会出现这个uid。而且因为要查找两个不同的月份,不一定这两个月都有消费,所以跑出来的数据很难看。以及要区分pc和无线,又存在相同的情况。所以要进行补零。

我是这么补零的,先跑一遍,生成一个result文件。用awk拿到这个文件中的所有的id,这里比较容易

cat result | awk '{a[$1]+=0;}END{for(i in a) print i}' > file1 

跑出来之后呢,就要和原始的uid比较,看少了哪些uid,使用命令grep -vwf file1 uid> end,

这样就可以找出缺少的uid。这行命令比较两个文件的不同,和comm命令比,好处就是,两个文件的区别和文字出现的顺序无关。

找出来之后,每次做sql语句之前,用拿uid去这里面找一遍。如果有,直接就造数据输出。

不同月份的sql语句不一样(老大要我查的东西不同),就用一个if语句。if [ "$3" = "12" ](一个空格不能少)then
sql="xxx" else sql="xxx" fi ,生成结果放到不同的文件,再次去找uid,看是否有漏掉的uid,用同样的方法解决。

ok,两个文件都生成了。又有新的问题出现了,有的uid的pc有数据,无线没数据。有的则相反,又要构造数据了。没有数据的后几位要填0。无线和pc用一个标志位区分(0和1),最后的结果应该是0,1,0,1……这样子分布。所以就有写了一行命令

cat info2015 | awk 'BEGIN{i=0} {if($3==i){print} else{print j"\t""2014-09-01""\t"1"\t"0"\t"0"\t"0"\t"0;i++;print};i++;i=i%2;j=$1}' > final2015 
大致造的数据是这一种格式。但是还完,因为不一定0,1,0,1就是安全的。uid数目*2就应该等于行数。发现少了两行,什么情况?因为有个别行缺了1,而他的下一个uid有恰好缺了0。这里我就百度了比较上下两行第一列是否相同的方法。结果时间太紧,我就没仔细看。看着挺复杂。
所以就曲线救国吧。我先把上下两行合并到一行,然后用awk去比对第一列和第八列(下一行的第一列出现在了第八列)。
合并:cat final2015|sed 'N;s/\n/ \t/' >system.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: