Chinaunix首页 | 论坛 | 博客
  • 博客访问: 512323
  • 博文数量: 119
  • 博客积分: 5054
  • 博客等级: 大校
  • 技术积分: 1305
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-03 13:13
文章分类

全部博文(119)

文章存档

2011年(4)

2010年(115)

我的朋友

分类:

2010-01-03 20:38:25

Pattern { Action }为awk中最主要的语法. 若某Pattern之值为真则执行它后方的 Action. awk中常使用”关系表达式”(Relational Expression)来当成 Pattern.

awk 中除了>, <, ==, != ,...等关系运算符( Relational Operators )外,另外提供 ~(match),!~(Not Match) 二个关系运算符. 利用这两个运算符, 可判断某字符串是否包含能匹配所指定正则表达式的子字符串. 由于这些特性, 很容易使用awk来编写需要字符串比对, 判断的程序.
[ 范例 :] 承上例,
组装部门员工调薪5%,(组装部门员工之ID以"A"开头)
所有员工最后之薪资率若仍低于100, 则以100计.
编写awk程序打印新的员工薪资率报表.

[分析:] 这个程序须先判断所读入的数据行是否合于指定条件, 再进行某些动作.awk中 Pattern { Actions } 的语法已涵盖这种 ” if ( 条件) { 动作} “的架构. 编写如下之程序, 并取名 adjust1.awk

$1 ~ /^A.*/ { $3 *= 1.05 } $3<100 { $3 = 100 }
{ printf("%s %8s %d\n", $1, $2, $3)}

执行下列命令 :

$awk -f adjust1.awk emp.dat 

结果如下 : 屏幕出现 :

A125    Jenny 105
A341      Dan 115
P158      Max 130
P148     John 125
A123    Linda 100

[说 明 :]
awk的工作程序是: 从数据文件中每次读入一个数据行, 依序执行完程序中所有的 Pattern{ Action }指令:

$1~/^A.*/ { $3 *= 1.05 }
$3 < 100 { $3 = 100 }
{printf("%s %8s %d\n",$1,$2,$3)}

再从数据文件中读进下一笔记录继续进行处理.

第一个 Pattern { Action }是: $1 ~ /^A.*/ { $3 *= 1.05 }
$1 ~ /^A.*/ 是一个Pattern, 用来判断该笔数据行的第一栏是否包含以"A"开头的子字符串. 其中 /^A.*/ 是一个Regular Expression, 用以表示任何以"A"开头的字符串.
Actions 部分为 $3 *= 1.05
$3 *= 1.05 与 $3 = $3 * 1.05 意义相同. 运算子"*=" 之用法则与 C 语言中一样. 此后与 C 语言中用法相同的运算子或语法将不予赘述.

第二个 Pattern { Actions } 是: $3 <100 {$3 = 100 } 若第三栏的数据内容(表薪资率)小于100, 则调整为100.

第三个 Pattern { Actions } 是: {printf("%s %8s %d\n",$1, $2, $3 )} 省略了Pattern(无条件执行Actions), 故所有数据行调整后的数据都将被印出.

阅读(687) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~