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

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

注:如果各位有更好的方法,或针对当前脚本有更好的建议,还请不吝赐教!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: