关于java:awk实现类sql的join操作

7次阅读

共计 1757 个字符,预计需要花费 5 分钟才能阅读完成。

awk、grep 和 sed 被称为 linux 三剑客,事实上 grep 和 awk 我在日常工作中也罕用到(sed 用的比拟少),可能有些人对 awk 理解比拟少,我先大略介绍下。很多人认为 awk 只是一个文本处理工具,实际上他们也是这么用的。但事实上它其实是一门语言,领有数学运算符、过程管制语句,甚至针对于文本处理封装了很多内置变量和函数,这造就了它弱小的文本处理能力。如果 grep 只能做到数据的筛选,那 awk 还能做到数据的解决、剖析甚至生成报表,毕竟它是一门残缺的编程语言。

因为这篇文章不是 awk 的入门教程,如果想入门的话我举荐阮一峰老师的 awk 入门教程 和 左耳朵耗子的 AWK 扼要教程。

回到我明天的正题,明天我给大家看个我常应用 awk 的场景。因为做后端开发,常常在做数据分析的时候会有这样的问题,1. 面对几十万条的数据,须要筛选出几百几千个特定 key 的数据。2. 对这几百万条数据,针对其中的 id 字段补齐其余字段。

这时候可能有精通 excel 的同学跳出来说 “就这,so easy,vlookup 就搞定!”,事实上,excel 的确能够解决问题,但有点重,甚至有些时候咱们在服务器上还用不了 excel。还有啥其余办法?针对我说的这俩场景,其实认真想一下,是不是 sql 中俩表 join 就能解决问题。实际上你并不需要真正把文件灌到数据库里,只须要用 awk 一条命令就能解决。

实例

咱们把问题具像下,假如有两个文件,score.txt 存着学号 + 问题的数据,另外一个 name.txt 存着学号 + 姓名的数据,你当初想晓得每个人都烤了多少分。

score.txt

id score 
1 87
2 67
3 68
4 75
5 90
6 100
7 0

name.txt

id name 
1 张三
2 李四
3 王五
4 赵二
5 刘能
6 熊大

你想得到一份蕴含学号 姓名和问题的数据,就像上面这样。

id score name 
1 87 张三
2 67 李四
3 68 王五
4 75 赵二
5 90 刘能
6 100 熊大
7 0

用 awk 生成这样的数据有多简略?只须要一行代码,你能够保留 name.txt 和 score.txt,而后执行上面命令尝试下。

awk 'ARGV[1]==FILENAME {map[$1]=$2} ARGV[2]==FILENAME {print $0, map[$1]}' name.txt score.txt  

简简单单就实现了 name.txt 和 score.txt 在 id 之上的 right join。

解释下下面的代码,ARGV 和 FILENAME 是 awk 内置的变量,ARGV 里寄存在 awk 所承受的参数列表 ,像下面 ARGV[1] 就是 ”name.txt”,ARGV[2]就是 ”score.txt”。awk 是面向行的,所以针对每一行数据都会执行 ARGV[1]==FILENAME {map[$1]=$2} ARGV[2]==FILENAME {print $0, map[$1]},每一行数据都会属于某个文件,FILENAME 标识出以后行所属的文件名,像在括号{} 前的 ARGV[1]==FILENAME 你能够看做是其余语法中的 条件判断,你能够认为它就是省略了 if,但和 if 的性能是统一的。

所以上述代码的含意就是 如果以后行是输出 name.txt 的,就把学号和姓名存在 map 里(awk 里的变量不必事后申明)。如果以后行是属于 score.txt,就从 map 里把姓名找进去,而后把数据输入。

结语

awk 'ARGV[1]==FILENAME {map[$1]=$2} ARGV[2]==FILENAME {print $0, map[$1]}' name.txt score.txt  

针对于不同的数据,只须要调整下 $ 前面的具体值,能够实现用不同的列作为 key 来做 join,其实这里并不比 sql 的 join 简单,但在 linux 服务器上却很不便。上网中我只是实现了 right join,如果在 print $0, map[$1] 前加上if (length(map[$1]) > 0) 就能够实现 inner join。left join 的话也只须要把文件名换一下。

晓得了这些,awk 实现多文件的交加、差集等操作都不在话下。另外 不要遗记了 awk 其实也是一门编程语言 ,所以它也能够实现很多很简单的逻辑,你能够把代码在某个文件里而后用 - f 参数调起,比方我之前老师用 awk 做一些简略的统计工作,比方计算均值、总和…… awk 几乎堪称 后端工程师提效利器

正文完
 0