Awk操作单元
一.员工薪资文件(emp.dat)
#文件中各字段依次为员工ID、姓名、薪资率、实际工时. ID中的第一码为部门识别码,"A"和"P"分别表示"组装"及"包装"部门。
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
将上边数据放入emp.dat文件中
二.数据行
1.数据行是awk从数据文件上读取数据的基本单位
2.第一笔数据行是"A125 Jenny 100 210"
三.字段或列
1.字段为数据行上被分隔开的子字符串
2.以数据行"A125 Jenny 100 210"为例, 第一栏 第二栏 第三栏 第四栏 A125 Jenny 100 210
3.一般是以空格符来分隔相邻的字段
Awk语法结构
一.Awk程序中主要语法Pattern{Actions},理解为如果Pattern条件成立,则自动执行Actions1指令
Pattern1{Actions1}
Pattern2{Actions2}
Pattern3{Actions3}
…
二.Pattern是什么?
一般常使用"关系表达式"都可以成为Pattern,例如:
1.x > 34是一个Pattern,判断变量x与34是否存在大于的关系。
2.x == y是一个Pattern,判断变量x与变量y是否存在等于的关系。
3.“banana” ~ /an/ 是一个Pattern,判断banana是否正则包含an字母。
三.Actions是什么?
Actions是由许多awk指令构成,例如:
1.Awk的I/O指令: print,printf,getline…
2.Awk的流程控制指令: if…else,while,for…
四.Awk原理实例
1.认识$0,$n的作用
{
print $0,"->",$1,"->",$2,"->",$3,"->",$4
}
2.pattern条件永远成立
{actions}
例子:
{
print $0
}
3.自带条件的关系表达式
$3>120{
print $2,$3
}
结果:
4.匹配名字中包含J的
$2~/J/{
print $2,$3
}
结果:
5.匹配名字以Jo开头
$2~/^Jo/{
print $2,$3
}
6.printf格式化输出
打印第2列开头为Jo的值并将其格式化
$2~/^Jo/{
printf("--%s--\n",$2)
}
结果:
7.if…else条件使用
获取第2列包含J的同时第3列的值大于120的值以加加打印出来,包含J的同时小于120以减减打印
$2~/J/{
if($3>120){
print $2,"++++",$3
}else{
print $2,"----",$3
}
}
结果:
实例:统计员工的应发工资
一.emp.dat员工薪资表
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
二.计算员工的应发工资
{
print $2,$3*$4,"元"
}
结果:
[root@VM-0-6-centos mnt]# awk -f test.awk emp.dat
Jenny 21000 元
Dan 23650 元
Max 27170 元
John 27500 元
Linda 19950 元
[root@VM-0-6-centos mnt]# cat emp.dat
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
[root@VM-0-6-centos mnt]#
三.空格是语言字符串连接符
{
print $2,$3*$4 "元"
}
结果:
[root@VM-0-6-centos mnt]# awk -f test.awk emp.dat
Jenny 21000元
Dan 23650元
Max 27170元
John 27500元
Linda 19950元
[root@VM-0-6-centos mnt]# cat emp.dat
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
[root@VM-0-6-centos mnt]#
实例:统计新的员工薪资率
一.需求:组装部门员工(ID以"A"开头的员工)调薪5%,所有员工最后之薪资率若仍低于100, 则以100计算
$1~/^A/{
$3*=1.05
if($3<100){
$3=100
}
print $2,$3*$4
}
结果:
[root@VM-0-6-centos mnt]# awk -f test.awk emp.dat
Jenny 22050
Dan 24832.5
Linda 21000
[root@VM-0-6-centos mnt]# cat emp.dat
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
[root@VM-0-6-centos mnt]#