前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神器!awk 在工作中的应用案例

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

作者头像
后端技术探索
发布2020-03-19 16:25:43
5330
发布2020-03-19 16:25:43
举报
文章被收录于专栏:后端技术探索

一、需求背景

  • 离线任务场景,每日产出一份
  • 汇总上游订单、点击数据,输出大客户的汇总数据
  • 和上游、下游系统之间的交互都是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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档