shell实现类矩阵格式数据统计及输出(hive环境下数据的过程化处理)
2015-04-06 16:09
543 查看
源数据:
数据为7天内每个用户有过打电话行为的天数、总的呼叫次数及日均呼叫次数
目标数据:
将数据转换成如下格式->日均呼叫次数为x,呼叫天数为y的人数
行标数字->日均呼叫次数x
列标数字->呼叫天数y
需要得到的数值->上述两者的交集
分析思路:
外层循环->行控制
内存循环->列控制
数组赋值->在内循环中接收awk统计的交叉点sum
具体实现:
#!/bin/bash
#file
filen=test.txt #源数据文件
filer=test.csv #目标数据文件
sed -i 's/\.0//g' ${filen} #将文件中的小数点去掉,只保留整数
sed -n '2,$p' ${filen} > mtmp.csv #除标题行的数据重定向到临时文件mtmp.csv
#列的个数,后续数组下标判断会用到
#awk先输出第三列“呼叫天数”,sort分类,uniq取唯一,wc -l 统计个数
n=`awk '{print $3}' mtmp.csv|sort|uniq|wc-l`
#将列标值重定向到目标文件,因为行的data多了一列行标,所以在开头加了个空格
echo " ""`awk '{print $3}'mtmp.csv|sort|uniq|sort -n|xargs`" > ${filer}
#awk先输出第四列“日均呼叫次数”,sort分类,uniq取唯一,sort按数组升序排序
for x in `awk '{print $4}'mtmp.csv|sort|uniq|sort -n`
do
#数组下标m初始化为0,每一行开始时,必须初始化m,否则m=n,if的条件返回false
#则不会对数组进行更新
m=0
#awk先输出第三列“呼叫天数”,sort分类,uniq取唯一,sort按数组升序排序
for y in `awk '{print $3}' mtmp.csv|sort|uniq|sort -n`
do
#数组下标小于等于列的个数减1
if [ ${m} -le $(($n-1)) ]
then
#awk定义外部变量c,代表当前列的值;awk定义外部变量l,代表当前行的值
#begin定义变量sum,初始值为0,if文件中第四列值等于l且第三列值等于c,则
#sum加1,依次对文件的每行进行扫描并判断,最后返回sum赋值给rcount[m]
rcount[${m}]=`awk -v c=${y} -v l=${x} 'BEGIN {sum=0} {if ($4==l&& $3==c) sum+=1} END {print sum}' mtmp.csv`
fi
#数组下标加1
let m=m+1
done
#将目标行行标及结果值追加到目标文件,${rcount[*]}->数组中所有的值
echo "${x} ${rcount[*]}" >>${filer}
done
#bash数组的分隔符默认是空格,为了可用excel打开,将空格转成逗号,保存为csv文件
sed -i 's/ /,/g' ${filer}
#删除临时文件
rm -f mtmp.csv
注:如果各位有更好的方法,或针对当前脚本有更好的建议,还请不吝赐教!!!
数据为7天内每个用户有过打电话行为的天数、总的呼叫次数及日均呼叫次数
目标数据:
将数据转换成如下格式->日均呼叫次数为x,呼叫天数为y的人数
行标数字->日均呼叫次数x
列标数字->呼叫天数y
需要得到的数值->上述两者的交集
分析思路:
外层循环->行控制
内存循环->列控制
数组赋值->在内循环中接收awk统计的交叉点sum
具体实现:
#!/bin/bash
#file
filen=test.txt #源数据文件
filer=test.csv #目标数据文件
sed -i 's/\.0//g' ${filen} #将文件中的小数点去掉,只保留整数
sed -n '2,$p' ${filen} > mtmp.csv #除标题行的数据重定向到临时文件mtmp.csv
#列的个数,后续数组下标判断会用到
#awk先输出第三列“呼叫天数”,sort分类,uniq取唯一,wc -l 统计个数
n=`awk '{print $3}' mtmp.csv|sort|uniq|wc-l`
#将列标值重定向到目标文件,因为行的data多了一列行标,所以在开头加了个空格
echo " ""`awk '{print $3}'mtmp.csv|sort|uniq|sort -n|xargs`" > ${filer}
#awk先输出第四列“日均呼叫次数”,sort分类,uniq取唯一,sort按数组升序排序
for x in `awk '{print $4}'mtmp.csv|sort|uniq|sort -n`
do
#数组下标m初始化为0,每一行开始时,必须初始化m,否则m=n,if的条件返回false
#则不会对数组进行更新
m=0
#awk先输出第三列“呼叫天数”,sort分类,uniq取唯一,sort按数组升序排序
for y in `awk '{print $3}' mtmp.csv|sort|uniq|sort -n`
do
#数组下标小于等于列的个数减1
if [ ${m} -le $(($n-1)) ]
then
#awk定义外部变量c,代表当前列的值;awk定义外部变量l,代表当前行的值
#begin定义变量sum,初始值为0,if文件中第四列值等于l且第三列值等于c,则
#sum加1,依次对文件的每行进行扫描并判断,最后返回sum赋值给rcount[m]
rcount[${m}]=`awk -v c=${y} -v l=${x} 'BEGIN {sum=0} {if ($4==l&& $3==c) sum+=1} END {print sum}' mtmp.csv`
fi
#数组下标加1
let m=m+1
done
#将目标行行标及结果值追加到目标文件,${rcount[*]}->数组中所有的值
echo "${x} ${rcount[*]}" >>${filer}
done
#bash数组的分隔符默认是空格,为了可用excel打开,将空格转成逗号,保存为csv文件
sed -i 's/ /,/g' ${filer}
#删除临时文件
rm -f mtmp.csv
注:如果各位有更好的方法,或针对当前脚本有更好的建议,还请不吝赐教!!!
相关文章推荐
- 环境搭建 Hadoop+Hive(orcfile格式)+Presto实现大数据存储查询一
- 最简单的c#处理程序输出json格式数据
- Flume-ng生产环境实践(三)实现文件sink,按照固定格式目录输出
- 对jsp的一个小结(1)搭建web应用环境、用jsp实现输出、实现数据传递
- 巧用matlab做中继实现excel数据按格式输出到word
- python实现爬虫统计学校BBS男女比例之数据处理(三)
- 处理tiff格式dem数据的方法——输出xyz坐标
- python中json格式数据输出实现方式
- Hive 处理CSV格式文件数据
- 用两个Repeater实现关联数据的格式输出
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- shell脚本实现系统监视统计与数据备份
- 在Shell脚本中编写AWK脚本实现数据提取—注意格式、awk中使用shell变量、awk中数字字符串转换成数字、awk中字符串相等比较
- Flume-ng生产环境实践(三)实现文件sink,按照固定格式目录输出
- 处理tiff格式dem数据的方法——输出txt形式高程信息
- 用两个Repeater实现关联数据的格式输出
- SpringMVC环境下实现的Ajax异步请求(JSON格式数据) 推荐
- UNIX环境高级编程学习之第六章系统数据文件和信息-修改第四章实现的Shell的“ls -l”功能
- Flume-ng生产环境实践(三)实现文件sink,按照固定格式目录输出