神器!awk 在工作中的应用案例

2020-03-19 16:25:43 浏览数 (2)

一、需求背景

  • 离线任务场景,每日产出一份
  • 汇总上游订单、点击数据,输出大客户的汇总数据
  • 和上游、下游系统之间的交互都是hdfs文件

二、详细介绍

  • 产出文件中 totalCount为当天userId的总营收
  • 产出文件中totalClick 为当天userId的总点击
  • 订单数据中需要根据订单状态过滤,只统计交易成功(orderStatus=2)的订单

三、方案代码:

当然可以使用你最熟悉的开发语言去写代码实现,本文用awk来实现,相比之下,性能极高。

注释版:

代码语言:javascript复制
#!/bin/sh
awk -F 't|x01' '
ARGIND==1{  // awk可同时操作多个文件,此处表示第一个文件 ka_20200308
    userid[$1]=1; // 这几行都表示初始化数组,key为userid
    username[$1]=$2;
    userphone[$1]=$3;
    income[$1]=0;
    click[$1]=0;
}
ARGIND==2{ // 遍历第二个文件每行进行处理 order_20200308
    if($3==1 && userid[$1]){ // 如果此行订单为已完成,则把金额汇总到对应userid
        income[$1] =$2;
    }
}
ARGIND==3{ // 第三个文件 cick_20200308
    if(userid[$4]){ // 汇总userid点击数
        click[$4]  ;
    }
}
END{ // 最后汇总并且格式化输出逻辑
    for(k in userid){ 
        print k"t"username[k]"t"userphone[k]"t"income[k]"t"click[k]
    }
}
' ka_20200308 order_20200308 click_20200308 >> output_20200308

纯享版:

代码语言:javascript复制
#!/bin/sh
awk -F 't|x01' '
ARGIND==1{
    userid[$1]=1;
    username[$1]=$2;
    userphone[$1]=$3;
    income[$1]=0;
    click[$1]=0;
}
ARGIND==2{
    if($3==1 && userid[$1]){
        income[$1] =$2;
    }
}
ARGIND==3{
    if(userid[$4]){
        click[$4]  ;
    }
}
END{
    for(k in userid){
        print k"t"username[k]"t"userphone[k]"t"income[k]"t"click[k]
    }
}
' ka_20200308 order_20200308 click_20200308 >> output_20200308

0 人点赞