AWK编程语言笔记第一章:基础语法

1 AWK 命令
pattern { action }

pattern表示模式匹配,action表示操作,两者都是可选的,通过花括号进行区分。

{action} 后可以追加多个文件,也可以使用 -f

awk 'program' input files
awk -f progfile optional list of input files

构建数据:

$ touch emp.data
$ vi emp.data
$ cat emp.data
Beth 4.00 0
Dan 3.75 0
Kathy 4.00 10
Mark 5.00 20
Mary 5.50 22
Susie 4.25 18
2 提取字段

awk 通过$提取字段,字段从1开始,0则为整行。

{ print $1, $3 }
{ print $O }
{ print }
3 计算字段个数

NF: number of fields,$NF表示最后一个字段。

$ awk ' {print NF, $1, $NF}' emp.data
3 Beth 0
3 Dan 0
...
4 计算已读行数

NR:counts the number of lines read so far

$ awk ' {print NR, $0}' emp.data
1 Beth 4.00 0
2 Dan 3.75 0
...
5 在打印字段中添加文字
$ awk '{print "line number:",NR, $0}' emp.data
line number: 1 Beth 4.00 0
line number: 2 Dan 3.75 0
...
6 通过%打印不同格式
$ awk '{printf("total pay for %s is $%.2f\n", $1, $2 * $3)}' emp.data
total pay for Beth is $0.00
total pay for Dan is $0.00
...

# -8表示8个字符并向左对齐
$ awk '{ printf("%-8s $%6.2f\n", $1, $2 * $3) }' emp.data
Beth     $  0.00
Dan      $  0.00
...
7 运算符
$ awk '$3>0 {print $1, $2*$3}' emp.data
Kathy 40
Mark 100
...

$ awk '$2 >=5 || $3 >= 20 {print $0}' emp.data
Mark 5.00 20
Mary 5.50 22

$ awk '$1=="Susie" {print $0}' emp.data
Susie 4.25 18

$ awk '!($2<5 && $3<20) {print $0}' emp.data
Mark 5.00 20
Mary 5.50 22
8 BEGIN 和 END

特殊模式BEGIN在读取第一个输入文件的第一行之前匹配,END在处理最后一个文件的最后一行之后匹配。

# print "", 打印空白行
$ awk 'BEGIN { print "NAME RATE HOURS";print ""}{print}' emp.data
NAME RATE HOURS

Beth 4.00 0
Dan 3.75 0
...

$ awk '{pay=pay+$2*$3} 
END {print NR, "employees"                                      
print "total pay is ", pay
print "average pay is", pay/NR}' emp.data
6 employees
total pay is  337.5
average pay is 56.25
9 字符处理
# 像处理数字一样处理文本
$ awk '$2>maxrate {maxrate=$2;maxemp=$1}
END {print "highest hourly rate:",maxrate,"for",maxemp}' emp.data
highest hourly rate: 5.50 for Mary

# 字符串连接
$ awk '{names=names $1 " "} END {print names}' emp.data
Beth Dan Kathy Mark Mary Susie

# 打印最后一行
$ awk '{last =$0} END {print last}' emp.data
Susie 4.25 18
10 内置函数
$ awk '{print $1, length($1)}' emp.data
Beth 4
Dan 3
...

$ awk '{nc=nc+length($0)+1
 nw=nw+NF}
 END {print NR , "lines,",nw,"words,",nc,"characters"}' emp.data
6 lines, 18 words, 77 characters
11 控制流
$ awk '$2>6 {n=n+1;pay=pay+$1*$3}
END {if (n>0)
    print n, "employees, total pay is",pay
   else
    print "no employees are paid more than $6/hour"
  }' emp.data
no employees are paid more than $6/hour

$ awk '{i=1;while(i <=2){print $1;i=i+1}}' emp.data

$ awk '{for (i=1;i<=3;i++) printf $2}' emp.data
12 处理数组

line[NR]=$0,将每行赋值到line数组中。

~$ awk '{line[NR]=$0} END {i=NR;while (i>0){print line[i];i--}}' emp.data
Susie 4.25 18
Mary 5.50 22
...
13 One-liners

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值