内容:
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
- 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
- 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), 故所有数据行调整后的数据都将被印出.
阅读(1929) | 评论(1) | 转发(0) |