• 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"]}'
  • 相关阅读:
    C/S WinFORM 快速开发框架 MyRapid快速开发框架更新日志 ---数据权限控制
    C/S WinFORM 快速开发框架 MyRapid快速开发框架更新日志 ---自动生成操作手册
    C/S WinFORM 快速开发框架 MyRapid快速开发框架更新日志 ---添加模块流程图
    代码分享:给窗体添加水印
    版本需更新提醒
    如何做好软件自动更新
    做项目管理踩过的坑
    团队开发的代码管理(VS)
    Java8尽管很香,你想过升级到Java11吗?会踩那些坑?
    这个 Spring 循环依赖的坑,90% 以上的人都不知道
  • 原文地址:https://www.cnblogs.com/centos2017/p/7896747.html
Copyright © 2020-2023  润新知