awk的使用 第三部分 awk如何选择正确的行

在awk使用方法中,Pattern{ Action }是awk使用的最主要语法。如果Pattern的值为真则执行它后方的Action。awk中常使用”关系表达式” (Relational Expression)当做Pattern。  
    awk 中除了>,<,==,!= 等关系运算符(Relational Operators)外,另外提供 ~(匹配match),!~(不匹配Not Match)二个关系运算符。利用这两个运算符,可判断某字符串是否包含能匹配所指定正则表达式的子字符串。 有这么多关系运算符,使用awk可以轻易的进行字符串的比较,并编写字符串处理的程序。  
    例如,单位的职工如下所示:
[root@benet pub]# cat emp.dat
A101 chenying 100 210
A304 linxiyu  110 215
S283 degnming 130 209
S267 liuchao  125 220
B108 hejing    95 210

    其中A开头的表示accp部门工作人员,工资加薪5%,加薪后员工薪资仍低于110的,以110计。编写awk程序打印新的员工薪资率报表。
    [分析] :这个程序须先判断所读入的数据行是否合于指定条件,再进行某些动作。awk中Pattern { Actions } 的语法已涵盖这种 “if (条件) {动作} “的架构。编写awk脚本程序adjust1.awk,脚本内容如下:
[root@benet pub]# cat adjust1.awk
#!/bin/awk -f
{
if($0~/A/){$3*=1.05}
if($3<110){$3=110}
printf(“%s %-8s %d/n”,$1,$2,$3)
}
    接下来,执行程序脚本:
    [root@benet pub]# awk -f adjust1.awk emp.dat
    结果如下:
    [root@benet pub]# awk -f adjust1.awk emp.dat
    A101 chenying 110
    A304 linxiyu  115
    S283 degnming 130
    S267 liuchao  125
    B108 hejing   110
    通过以上输出,可以发现,数值改变的只有在工号中有A的行。下面来看一下awk执行的步骤:首先,awk从数据文件中每次读入一个数据行, 依序执行程序中所有的 Pattern{ Action }指令:
if($0~/A/){$3*=1.05}
if($3<110){$3=110}
printf(“%s %-8s %d/n”,$1,$2,$3)
    再从数据文件中读取下一行记录继续进行处理。
    第一个Pattern { Action }是: if($0~/A/){$3*=1.05},if($0~/A/)是一个Pattern,用来判断该笔数据行的第一行是否包含”A”。 其中~/A/是一个正则表达式Regular Expression,用来表示在整行数据中含有A的字符串。Actions部分为{$3*=1.05},$3*=1.05与$3=$3*1.05意义相同。 运算符”*=” 的用法与C语言中的用法一样。此后与C语言中用法相同的运算子或语法将不予赘述。  
    第二个 Pattern { Actions } 是:if($3<110){$3=110},如果第三栏的数据内容(表薪资率)小于110, 则调整为110。
    第三个 Pattern { Actions } 是:printf(“%s %-8s %d/n”,$1,$2,$3),省略了Pattern(无条件执行Actions), 故所有数据行调整后的数据都将被印出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值