AWK基础教程

前言

之前针对WorkerHub小程序做的数据分析文章 互联网卷王花落谁家? 收到了一些小伙伴的回复,点名要学习数据分析,其实我也是一知半解,想着来写几篇文章简单聊下我分析的过程。

首先是数据清洗和统计了,这块我并没有用诸如Python之类的脚本语言,虽然Python提供了很多强大的数据分析库如Pandas、Numpy等,但是毕竟要麻烦一些,还要写个脚本,装一堆库(PS:其实就是懒)。

我用的是一个老的Unix工具 AWK,虽然历史比较久远,但是它简洁和丰富的功能可以称之为神器,同时也是后台同学必须要掌握的一个工具,毕竟通过日志紧急定位线上问题的时候,你不能跟老板说:等等我先写个脚本,那老板原地暴毙了。

应用场景

AWK是1977年贝尔实验室的三个兄弟( Alfred Aho、Peter Weinberger、 Brian Kernighan )搞出来的文本分析工具,这三个哥们的首字母拼起来就是AWK的名字了。

AWK处理文本就像其他语言处理数值一样方便,所以经常被应用在文本处理领域。

比如日志分析、数据清洗、文本过滤、数据统计等。

同时AWK也是一门编程语言,不过它的命令行用法就可以满足大多数的应用场景。

我们通常可以使用一行AWK命令完成一个脚本的任务!!!

AWK所适用的文本处理通常都有一些共同&显著的特点:

1. 输入数据格式统一

比如日志,为了对日志进行上报、监控、统计分析,我们通常会采用一些分割手段来记录日志 (或者json等易于统计的格式)。

例如如下日志采用"|"来分割日志。

# 日志格式:{服务}|{日期}|{业务}|{请求URL}|{返回状态}|{请求耗时}|{请求参数}|{返回参数}...

比如CSV文件,采用","来分割。

# CSV格式:field1,field2,field3...

如果输入数据不是固定格式,通常会使用sed、grep等工具来过滤、清洗为awk可以处理的形式。

2. 每一列代表固定含义,便于数据分析

输入文件每一行的相同列类型一致,如果每一列含义不同,那就失去了数据分析的意义。

比如本文的第一个演示数据,第一列表示地区,第二列表示总人口等。

演示数据来源于国家统计局。

各地区户口登记地在外乡镇街道的人口状况

由于演示数据文件行数太多占用篇幅较长,以下演示均只展示前几条数据。

$ cat population.txt|head -n 10
地区      合计      本县/市/区  本省其他县/市/区     省外
全国    260937942   90372599     84689006       85876337
北京    10498288    1582574      1871181        7044533
天津    4952225     1095282      865442         2991501
河北    8297279     4263957      2628649        1404673
山西    6764665     3643627      2189385        931653
内蒙古  7170889     2732591      2994117        1444181
辽宁    9310058     3899728      3623800        1786530
吉林    4462177     2604239      1401439        456499
黑龙江  5557828     2800727      2250704         506397

Let’s start !!!

基本用法

一个AWK程序的组成非常简单,它的核心内容是:一个或多个 “模式–动作” 语句序列。

“模式–动作” 序列用单引号包起来,动作放在花括号里,再传入输入文件即可。

### 一个 模式-动作
awk 'pattern {action}' input_files

### 多个 模式-动作
awk 'pattern1 {action1} pattern2 {action2} pattern3 {action3} ...' input_files

AWK会每次读取一个输入行,对读取到的每一行,按顺序检查每一个模式。

如果当前行符合模式,则执行对应动作。

所以AWK的工作原理就是按顺序匹配模式然后执行动作。

可以想象到AWK伪代码大概长这样,我猜的(*_*)。

### AWK伪代码  我猜的 (*^_^*)
while(getline(inputfile))
{
   
	if(模式1 == true)
	{
   
		动作1;
	}
	if(模式2 == true)
	{
   
		动作2;
	}
	....
}

AWK在自动扫描输入文件的同时, 也会按照分隔符(默认空格/Tab)把每一个输入行切分成字段。

其中 $0 表示整行,$1,$2…$n 分别表示第一列,第二列…第N列。

大致的流程图如下:

AWK基础教程_第1张图片

大部分的工作都是AWK自动完成的:包括按行输入,字段分割,字段存储等。

所以我们只需要给出 “模式–动作” 序列就可以完成对文件的操作!!!

来个 Hello World 吧,输出 “hello” 和 整行 ($0)。

print 函数使用逗号分隔不同的参数,打印结果用空格符分隔,并且会自动换行。(类似于各大语言println函数)。

模式可以省略,表示匹配所有行。

$ awk '{print "hello",$0}' population.txt|head -n 5
hello 地区      合计      本县/市/区  本省其他县/市/区     省外
hello 全国    260937942   90372599     84689006       85876337
hello 北京    10498288    1582574      1871181        

你可能感兴趣的:(基础编程,后端,数据分析)