天天看点

AWK编程语言笔记第二章:语法结构

1 准备数据

$ vi countries
$ cat countries
ussr 8689 275 asia
canada 3852 25 north america
china 3705 1032 asia
usa 3615 237 north america
brazil 3286 134 sourth america
india 1267 746 asia
mexico 762 78 north america
france 211 55 europe
japan 144 120 asia
germany 96 61 europe
england 94 56 europe      

2 模式

AWK编程语言笔记第二章:语法结构

BEGIN 在awk读取前执行,END在awk读取后执行。

AWK编程语言笔记第二章:语法结构
2.1 比较运算符
AWK编程语言笔记第二章:语法结构
2.2 字符串匹配
AWK编程语言笔记第二章:语法结构
2.3 正则表达式
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
2.4 转义字符
AWK编程语言笔记第二章:语法结构
2.5 复合模式
AWK编程语言笔记第二章:语法结构
$ awk '$4 ~ /^(asia|europe)$/ {print $0}' countries
ussr 8689 275 asia
china 3705 1032 asia
...

$ awk '$4 ~ /asia/ || /europe/ {print $0}' countries
ussr 8689 275 asia
...
england 94 56 europe

$ awk '$4 ~ /asia|europe/ {print $0}' countries
ussr 8689 275 asia
...
england 94 56 europe

$ awk '$4 !~ /asia|europe/ {print $0}' countries
canada 3852 25 north america
...
mexico 762 78 north america      
2.6 Range Patterns

范围模式匹配 pat1 和 pat2 之间的每一行;pat2 可以与 pat1 匹配同一行,使范围为单行。

每当范围的第一个模式匹配时,就开始匹配;如果随后没有找到第二个模式的实例,则匹配到输入末尾的所有行。

/Canada/, /USA/      
$ awk '$4 ~ /europe/,/africa/ {print $0}' countries
france 211 55 europe
japan 144 120 asia
germany 96 61 europe
england 94 56 europe

# 第一行至第2行
$ awk 'NR==1,NR==2 {print $0}' countries
ussr 8689 275 asia
canada 3852 25 north america

# 第一行至第五行
$ awk 'FNR==1,FNR==5 {print FILENAME ":" $0}' countries
countries:ussr 8689 275 asia
countries:canada 3852 25 north america
countries:china 3705 1032 asia
countries:usa 3615 237 north america
countries:brazil 3286 134 sourth america      

3 动作

AWK编程语言笔记第二章:语法结构
3.1 内置变量
AWK编程语言笔记第二章:语法结构
3.2 数学运算符
AWK编程语言笔记第二章:语法结构
$ awk '{print ($2 >200 ? $2:"$2 less than 200" NR)}' countries
8689
3852
3705
3615
3286
1267
762
211
$2 less than 2009
$2 less than 20010
$2 less than 20011

$ awk '$4=="asia" {pop=pop+$3;n=n+1}                                                   
END {print "total population of the",n,
    "asian countries is " ,pop,"million."}' countries
total population of the 4 asian countries is  2173 million.

$ awk '$3>maxpop {maxpop=$3;country=$1}
> END {print "contry with largest population:", country,maxpop}' countries
contry with largest population: china 1032      
3.3 内置数学函数
AWK编程语言笔记第二章:语法结构
# 字符串作为表达式
$ awk 'BEGIN {digits="^[0-9]+$"}
$2 ~ digits {print $0}' countries
ussr 8689 275 asia
canada 3852 25 north america
...

$ awk 'BEGIN {
}
sign = "[+-]?"
decimal= "[0-9]+[.]?[0-9]*"
fraction= "[.][0-9]+"
exponent= "([eEl" sign "[0-9]+)?"
number= nAn sign"(" decimal "I" fraction ")" exponent "$"
$0 ~ number' countries      

其中,​

​/ /​

​​和​

​" "​

​在正则中等价,如:

$0 - /(,+l-)[0-9]+/
$0 - "(,\+l-)[0-9]+"      
3.4 内置字符函数
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构
3.5 控制流
AWK编程语言笔记第二章:语法结构
3.6 输出函数
AWK编程语言笔记第二章:语法结构
AWK编程语言笔记第二章:语法结构

继续阅读