当前位置:首页 > 开发 > 互联网 > 正文

常用统计分析 SQL 在 AWK 中的实现

发表于: 2015-05-23   作者:cfyme   来源:转载   浏览次数:
sql
摘要: 本文主要讲述如何在 awk 中实现 SQL 的常用操作,当做个简单的 awk 入门分享。虽然文中部分 awk 会有其它更简洁高效的 shell 命令去完成,亦或是其它语言去完成,但这都不在本文的讨论范畴。 注:本文所用到的两个测试文件 user、consumer,分别模拟两张 SQL 表: user 表,字段: id name  addr 1 zhangsan h

本文主要讲述如何在 awk 中实现 SQL 的常用操作,当做个简单的 awk 入门分享。
虽然文中部分 awk 会有其它更简洁高效的 shell 命令去完成,亦或是其它语言去完成,
但这都不在本文的讨论范畴。

注:本文所用到的两个测试文件 user、consumer,分别模拟两张 SQL 表:

user 表,字段: 
id name  addr 

1 zhangsan hubei 
3 lisi tianjin 
4 wangmazi guangzhou 
2 wangwu beijing 

consumer 表,字段: 
id cost date 

1 15 20121213 
2 20 20121213 
3 100 20121213 
4 99 20121213 
1 25 20121114 
2 108 20121114 
3 100 20121114 
4 66 20121114 
1 15 20121213 
1 115 20121114 

测试环境 
OS 版本: 
uname -a 
CYGWIN_NT-6.1 june-PC 1.7.9(0.237/5/3) 2011-03-29 10:10 i686 Cygwin 
awk 版本: 
awk --version 
GNU Awk 3.1.8 

1、查询整张表记录,where 条件过滤,关键词:where
select * from user; awk 1 user;
select * from consumer where cost > 100;
awk '$2>100' consumer


2、对某个字段去重,或者按记录去重,关键词:distinct
select distinct(date) from consumer;
awk '!a[$3]++{print $3}' consumer
select distinct(*) from consumer;
awk '!a[$0]++' consumer


3、记录按序输出,关键词:order by
select id from user order by id;
awk '{a[$1]}END{asorti(a);for(i=1;i<=length(a);i++){print a[i]}}' user


4、取前多少条记录,关键词:limit
select * from consumer limit 2;
awk 'NR<=2' consumer
awk 'NR>2{exit}1' consumer # performance is better


5、分组求和统计,关键词:group by、having、sum、count
select id, count(1), sum(cost) from consumer group by id having count(1) > 2;
awk '{a[$1]=a[$1]==""?$2:a[$1]","$2}END{for(i in a){c=split(a[i],b,",");if(c>2){sum=0;for(j in b){sum+=b[j]};print i"\t"c"\t"sum}}}' consumer


6、模糊查询,关键词:like(like属于通配,也可正则 REGEXP)
select name from user where name like 'wang%';
awk '$2 ~/^wang/{print $2}' user
select addr from user where addr like '%bei';
awk '/.*bei$/{print $3}' user
select addr from user where addr like '%bei%';
awk '$3 ~/bei/{print $3}' user


7、多表 join 关联查询,关键词:join
select a.* , b.* from user a inner join consumer b  on a.id = b.id and b.id = 2;
awk 'ARGIND==1{a[$1]=$0;next}{if(($1 in a)&&$1==2){print a[$1]"\t"$2"\t"$3}}' user consumer


8、多表水平联接,关键词:union all
select a.* from user a union all select b.* from user b;
awk 1 user user
select a.* from user a union select b.* from user b;
awk '!a[$0]++' user user


9、随机抽样统计,关键词:order by rand()
SELECT * FROM consumer ORDER BY RAND() LIMIT 2;
awk 'BEGIN{srand();while(i<2){k=int(rand()*10)+1;if(!(k in a)){a[k];i++}}}(NR in a)' consumer

 

转载地址:http://religiose.iteye.com/blog/1827495

常用统计分析 SQL 在 AWK 中的实现

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
网站数据统计分析工具是网站站长和运营人员经常使用的一种工具,比较常用的有谷歌分析、百度统计 和
一、数据库的基本操作 数据库是用来存储表的地方,在数据库开始创建的时候,要先创建好DATABASE然后
一、数据库的基本操作 数据库是用来存储表的地方,在数据库开始创建的时候,要先创建好DATABASE然后
近来在看sql的一些东西,将一些步骤记录下来。 1. 使用explain来检查查询走索引的情况 2. 将数据库
近来在看sql的一些东西,将一些步骤记录下来。 1. 使用explain来检查查询走索引的情况 2. 将数据库
世界上的软件80%是运行在内网的,为了使得运行在客户端的软件有良好的体验,并且得到有用的数据,我
在上篇在SSIS 2012中使用CDC(数据变更捕获)中,介绍了如何在SSIS 2012中使用CDC,本文在此基础上
页和盘区(Page and Extents) 你的表(Tables)中数据实际上都存储在 页(pages)里,除了BLOB类型
在Hive中,如果一个很大的表和一个小表做join,Hive可以自动或者手动使用MapJoin,将小表的数据加载
在Hive中,如果一个很大的表和一个小表做join,Hive可以自动或者手动使用MapJoin,将小表的数据加载
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号