Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3009970
  • 博文数量: 272
  • 博客积分: 5544
  • 博客等级: 大校
  • 技术积分: 5496
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 00:48
个人简介

  每个人都要有一个骨灰级的爱好,不为金钱,而纯粹是为了在这个领域享受追寻真理的快乐。

文章分类

全部博文(272)

文章存档

2015年(2)

2014年(5)

2013年(25)

2012年(58)

2011年(182)

分类: LINUX

2011-05-14 13:40:50

内容:
A125 Jenny 100 210
A341 Dan 110 215
P158 Max 130 209
P148 John 125 220
A123 Linda 95 210
 
$1:员工工号(A为组装部 P为包装部)
$2:员工姓名
$3:工资/小时
$4:工作时长
 
例1--打印出员工工资表:
Jenny  Work hours: 100  Pay: 21000
Dan    Work hours: 110  Pay: 23650
Max    Work hours: 130  Pay: 27170
John   Work hours: 125  Pay: 27500
Linda  Work hours:  95  Pay: 19950
 
  1. awk '{printf("%-5s Work hours: %3d Pay: %5d\n",$2,$3,$3*$4)}' file

[解析]
  因为前面没有Pattern匹配,所以无条件执行格式化输出:$2为5个字符的字符串,不足5位的空格补足并向左靠齐,Work hours: $3为3位的整数输出,Pay: $3和$4的乘积,以5位整形输出并换行,printf默认不换行,所以须在末尾加上\n,这点跟print有区别。

 

例2--组装部门员工调薪5%,所有员工最后之薪资率若仍低于100, 则以100计。

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

  1. awk '$1~/^A.*/{$3*=1.05} $3<100{$3=100} {printf("%s %8s %d\n",$1,$2,$3)}' file
[解析]
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), 故所有数据行调整后的数据都将被印出.
阅读(1910) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

ivyliner2012-06-27 08:42:19

awk '$1 ~ /^A.*/{$3=($3*1.05>100)?$3*1.5:100;print $0}' data