Shell 统计导出数据 awk 里使用shell变量 参数

有一个数据文件  yue.csv  是这样的

#head yue.csv 
日期,商家名称,要求在线数,当天在线数,要求在线时长,在线时长达标数,

……
"2017-12-31","唐河馆","10","3","09:00-17:00","1",
……
"2017-12-15","唐河馆","10","3","09:00-17:00","1",
……
"2016-12-01","宛城馆","10","1","09:00-17:00","1",
"2016-12-01","安阳馆","10","2","09:00-17:00","2",
"2016-12-01","卧龙馆","10","1","09:00-17:00","1",
"2016-12-01","卧龙书城","10","1","09:00-17:00","1",
"2016-12-01","浪飞仙","10","1","09:00-17:00","1",
"2016-12-01","平舆超市","10","1","09:00-17:00","1",
"2016-12-01","商水馆","10","1","09:00-17:00","1",

有几百家加盟店,某个店每天登陆就会记录一行
数据大概有一千行
现在要计算每个加盟店的  月登录率=店的月登陆天数/月天数

公式1如下:
# cat yue.csv |cut -d',' -f2|sort|uniq -c|sort -nr|awk '{for(i=1;i<NF;i++){$i/=31}}1'>1.txt

截取第二列店名  排序  去重统计数量  按名次排序  对第二列进行除法计算  


结果:
[root@localhost ~]# cat yue.csv |cut -d',' -f2|sort|uniq -c|sort -nr|awk '{for(i=1;i<NF;i++){$i/=31}}1'|less
0.966667 "济源馆"
0.933333 "修武馆"
0.933333 "荥阳馆"
0.9 "鹿邑馆"
0.9 "兰考馆"
0.9 "方城县"
0.9 "邓州馆"
0.9 "泌阳馆"
0.866667 "郑州馆"
0.866667 "西峡馆"
0.866667 "淅川馆"


公式1适用于 有多列需要修改的情况,思考下只计算第一列  可以简单些

公式2如下:
# cat yue.csv |cut -d',' -f2|sort|uniq -c|sort -nr| awk '{$1=$1/30}1{print $0}'|less



脚本1:
继续优化 有命令写成一个shell脚本 1.sh,执行时带有一个文件名的参数
#!/bin/bash
filename=$1
#cat $filename |cut -d',' -f2|sort|uniq -c|sort -nr|awk '{$1=$1/30}1{print $0}'>1.txt
cat $filename |cut -d',' -f2|sort|uniq -c|sort -nr|awk '{for(i=1;i<NF;i++){$i/=30}}1'>1.txt

执行时 直接    
#1.sh 文件名.csv 
目录下就生成一个1.txt文件



脚本2:
上一个脚本只传递了一个文件名参数,应该再增加一个每月天数的 参数 
例如  
#1.sh  yue.csv 30

脚本如下
#!/bin/bash
filename=$1
#cat $filename |cut -d',' -f2|sort|uniq -c|sort -nr|awk '{$1=$1/30}1{print $0}'>1.txt
cat $filename |cut -d',' -f2|sort|uniq -c|sort -nr|awk  -v nvar="$2" '{for(i=1;i<NF;i++){$i/= nvar }}1'>1.txt


!!!这里要注意的是  在awk中 使用shell的参数,
!   !   !  默认不能直接使用的,可以使用一下方法

shell 中变量为    TIME=60    参数为$1 

1. awk -v 选项让awk 里使用shell变量 、参数
awk -v time="$TIME" 'BEGIN{FS="|"} {if ($7> time) print $2 }' 
或 awk -v time="$1" 'BEGIN{FS="|"} {if ($7>time) print $2 }' 
这样要注意:在awk里,time不能加$符号。

2.   " ' $变量' "
awk  'BEGIN{FS="|"} {if ($7>"'$ time'" ) print $2 }' 

3.  ' "$变量" '
awk  'BEGIN{FS="|"} {if ($7>"'$ time'" ) print $2 }' 

4.export 变量  使用ENVIRON["var"]形式
$var="this is a test";export $var 
awk 'BEGIN{print ENVIRON["var"]}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值