本文主要讲述如何在 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
相关推荐
awk中的-F选项用于指定输入行的分隔符,这样awk在处理文件时就会按照指定的分隔符来分割每行的数据。awk的处理流程包括读取数据(从文件或管道)、改变分割符(使用-F选项)、逐行读入文件、以分隔符切片每行数据,...
7. Bash和Jenkins:在大数据环境中,Bash脚本常与持续集成工具如Jenkins结合,实现自动化构建、测试和部署大数据解决方案。 8. HBase和Cassandra:这些NoSQL数据库系统也经常用到脚本来进行数据导入导出、备份恢复...
函数在SQL中有着广泛的应用,比如聚合函数(SUM, COUNT, AVG, MAX, MIN)用于对一组数据进行统计计算,而其他函数如CONCAT用于字符串连接,DATE函数处理日期和时间等。了解并熟练运用这些函数,能极大地提升数据处理...
5. **表和索引的分析**:定期分析表和索引以优化性能,`analyze table`和`analyze index`是常用的SQL命令,可以在shell脚本中调用。 6. **表空间的使用情况**:使用`df`命令可以查看磁盘空间的使用情况,特别关注...
在数据分析场景中,Shell脚本可以用来批量处理文件,如数据导入导出,格式转换,或者运行统计分析脚本。熟悉grep、awk、sed等命令,以及如何编写循环、条件判断等逻辑,能极大地提高数据处理效率。此外,熟练使用...
在IT领域,尤其是在数据分析、日志处理或自动化脚本编写中,熟练掌握操作结构化文本数据的命令行工具是至关重要的。"用于操作结构化文本数据的命令行工具列表" 提供了一系列这样的工具,帮助用户在终端环境中高效地...
这个脚本首先读取 Nginx 的日志文件,统计每个 IP 的访问次数,然后将访问次数超过 10 的 IP加入到防火墙的黑名单中,以防止 Dos 攻击。 2. Linux 系统发送告警脚本 下一个示例是 Linux 系统发送告警脚本。这个...
### 监控Oracle数据库的常用Linux Shell脚本 #### 一、前言 在现代企业环境中,Oracle数据库作为核心的数据管理工具,其稳定性和性能至关重要。对于DBA(数据库管理员)来说,日常维护工作中的一项重要任务就是...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,用于存储和管理各种类型的数据。为了确保数据库的高效运行和稳定性,监控MySQL...在实际环境中,还可以结合日志分析、性能监视器等工具,构建更全面的监控体系。
3. **数据分析与科学计算**:例如Pandas、NumPy、SciPy、Matplotlib,用于数据处理、统计分析和可视化。 4. **版本控制系统**:如Git,包含常用的克隆、提交、分支、合并等操作。 5. **数据库**:MySQL、...
R语言是数据科学领域最常用的语言之一,以其强大的统计计算和图形生成功能而闻名。通过R,你可以进行数据清洗、建模和可视化。`dplyr`包提供了数据操作的语法糖,使得数据操纵更加直观;`ggplot2`则是绘制高质量...
- **3.5 分析session中SQL执行情况**:分析会话中SQL语句的执行情况以优化性能。 - **3.6 explain**:使用explain工具分析查询计划。 #### 数据库备份及恢复 - **4.1 export与import方式**:利用Oracle提供的导出...
- **用途**:实现分布式计算环境中的对象交互。 31. **comm=common** - **含义**:比较两个已排序的文件,并找出它们的共同部分。 - **用途**:查找两个文件之间的公共行。 32. **cp=CoPy** - **含义**:复制...
- `# awk [脚本程序或命令] [文件]`:强大的文本分析工具。 - **文件压缩与解压**: - `# gzip [选项] [文件]`:压缩文件。 - `# tar [选项] [文件]`:打包和解包文件。 - **环境变量与shell脚本**: - `# echo ...