当前位置: 技术问答>linux和unix
关于文本处理的脚本,请大侠过眼,100分赠送
来源: 互联网 发布时间:2017-04-14
本文导语: 请大侠帮我修改下代码: 源数据为30个文件,分别对应N个用户的30天的高峰并发 数据样子为 第一个文件,为5月2日的用户访问 用户 时间 当日高峰访问次数 90000031 20130502 315 90000032 ...
请大侠帮我修改下代码:
源数据为30个文件,分别对应N个用户的30天的高峰并发
数据样子为
第一个文件,为5月2日的用户访问
用户 时间 当日高峰访问次数
90000031 20130502 315
90000032 20130502 1
90000033 20130502 21
第二个文件,为5月3日的用户访问
用户 时间 当日高峰访问次数
70000001 20130502 221
90000031 20130503 301
90000032 20130503 1
90000033 20130503 13
90000034 20130503 88
90000035 20130503 30
90000036 20130503 168
第三个文件,为5月4日的用户访问,文件格式和前面的类似
每个文件的用户数目不一定相同,要求对有重复的用户数才计算高峰访问次数的变化率
----------描述结束--------
现在的目标是实现统计当天的用户访问变化率并排序,即把两天的访问次数做减法再除下前天的值,列如5月3日的变化率为,要减去5月2日的并发才能获取到差值
90000031 20130503 (301-315)/315
90000032 20130503 (1-1)/1
90000033 20130503 (13-21)/21
再将红色的按照次序排就可以排列出访问变化率了
我做的样子是,写了类似的脚本,运行./xxxx.sh $No1 $NO2 $NO3
分为为 : 脚本名称 前天时间参数 当天时间 前N名和用户排名
就可以得出某一天的用户访问变化率排名了
====下面是我写的脚本====
#!/bin/bash
#判定输入参数是否达到要求并给出意见
if [ -z "$3" ]
then
echo "输入参数不符合要求!"
echo "请输入有效统计时间,格式为:./ranking NO1 NO2 NO3"
echo "ranking:本次排名统计脚本名称"
echo "NO1:前一天日期"
echo "NO2:当天的日期"
echo "NO3:控制统计的和用户数量"
exit
fi
Yesterday=$1
Today=$2
Ranknum=$3
file_dir=/home/tmp
file_content=$(ls|grep -v default)
cd ${file_dir}
for file in ${file_content}
do
cd ${file_dir}
if [ -f ${file} ]
then
##Yesterday无法带入到awk中
#Yesterdaybingfa=`echo |awk '{if("$1"="${Yesterday}") print $5}' ${file}`
Yesterdaybingfa=`echo $file |grep ${Yesterday} | awk '{print $5}'`
Todaybingfa= `echo $file |grep ${Today} | awk '{print $5}'`
echo $Yesterdaybingfa
Rank=`echo |awk '{print $Yesterdaybingfa/$Todaybingfa-1}'`
Name=substr($file,3,6)
#输出到当天的日志
echo '$Name $Rank' >>${Today}.log
done
#查询不同用户的访问变化率排行
cat ${Today}.log |sort |uniq |head -n ${Ranknum} >${Today}.log_${Ranknum}
源数据为30个文件,分别对应N个用户的30天的高峰并发
数据样子为
第一个文件,为5月2日的用户访问
用户 时间 当日高峰访问次数
90000031 20130502 315
90000032 20130502 1
90000033 20130502 21
第二个文件,为5月3日的用户访问
用户 时间 当日高峰访问次数
70000001 20130502 221
90000031 20130503 301
90000032 20130503 1
90000033 20130503 13
90000034 20130503 88
90000035 20130503 30
90000036 20130503 168
第三个文件,为5月4日的用户访问,文件格式和前面的类似
每个文件的用户数目不一定相同,要求对有重复的用户数才计算高峰访问次数的变化率
----------描述结束--------
现在的目标是实现统计当天的用户访问变化率并排序,即把两天的访问次数做减法再除下前天的值,列如5月3日的变化率为,要减去5月2日的并发才能获取到差值
90000031 20130503 (301-315)/315
90000032 20130503 (1-1)/1
90000033 20130503 (13-21)/21
再将红色的按照次序排就可以排列出访问变化率了
我做的样子是,写了类似的脚本,运行./xxxx.sh $No1 $NO2 $NO3
分为为 : 脚本名称 前天时间参数 当天时间 前N名和用户排名
就可以得出某一天的用户访问变化率排名了
====下面是我写的脚本====
#!/bin/bash
#判定输入参数是否达到要求并给出意见
if [ -z "$3" ]
then
echo "输入参数不符合要求!"
echo "请输入有效统计时间,格式为:./ranking NO1 NO2 NO3"
echo "ranking:本次排名统计脚本名称"
echo "NO1:前一天日期"
echo "NO2:当天的日期"
echo "NO3:控制统计的和用户数量"
exit
fi
Yesterday=$1
Today=$2
Ranknum=$3
file_dir=/home/tmp
file_content=$(ls|grep -v default)
cd ${file_dir}
for file in ${file_content}
do
cd ${file_dir}
if [ -f ${file} ]
then
##Yesterday无法带入到awk中
#Yesterdaybingfa=`echo |awk '{if("$1"="${Yesterday}") print $5}' ${file}`
Yesterdaybingfa=`echo $file |grep ${Yesterday} | awk '{print $5}'`
Todaybingfa= `echo $file |grep ${Today} | awk '{print $5}'`
echo $Yesterdaybingfa
Rank=`echo |awk '{print $Yesterdaybingfa/$Todaybingfa-1}'`
Name=substr($file,3,6)
#输出到当天的日志
echo '$Name $Rank' >>${Today}.log
done
#查询不同用户的访问变化率排行
cat ${Today}.log |sort |uniq |head -n ${Ranknum} >${Today}.log_${Ranknum}
|
Yesterdaybingfa=`awk -v y="$Yesterday" '{if($1=y) print $5}' ${file}`