某公司其员工到勤时间表如下, 取名为 arr.dat, 文件中第一栏为员工代号, 第二栏为到达时间. 本示例中将使用该文件为数据示例文件,
1034 7:26
1025 7:27
1101 7:32
1006 7:45
1012 7:46
1028 7:49
1051 7:51
1029 7:57
1042 7:59
1008 8:01
1052 8:05
1005 8:12
要求:
(1) 将数据arr.dat按员工ID排序, 并在表头附加上执行时的日期
(2) 在arr.dat之前增加一行数据抬头如下" ID Number Arrival Time"
(3) 若八点为上班时间, 请加标注"*" 与迟到时间之后, 并计算平均上班时间.
(4) 将arr.dat重新输出到today.art文件中
答案与解析:
建立文件名为reformat.awk的awk文件, 内容如下
BEGIN { FS="[ \t:]" #此处重新定义输入字段分隔符, 默认值为空白, 此处使用 [ \t:]+ (为正则表达式) 表示 \ 使用 "空吧, tab或 : " 做组成的字符创做分隔符, + 表示可以出现一次或一次以上; "date" | getline #此处为在awk中调用shell的命令, 需要使用 ""括主, 并且需要使用 pipe( | ) 传递给 getline(awk的内建函数, 用于调用shell命令); print " Today is ",$2, $3 > "today.art" #输出重定向, 将输出重定向到today.art中, 并创建文件 print "====================================" >> "today.art" # 使用>> 而非 > , >> 是在原有文件后面追加, > 是清空文件, 故使用 >> print " ID Number Arrival Time" >> "today.art" close("today.art") #此处稍后解释 } { arrival = HM_to_M( $2, $3 ) # 此处为awk中的自定义函数, 在后边定义, 是计算迟到时间, 将时间转换成分钟 printf(" %s %s:%s %s\n", $1, $2, $3, arrival > 480 ? "*" : " ") | " sort -k 1 >> today.art" # 通过重新定义FS, 将源文件 分割成3 段, 第2, 3段表示的时间, 其中arriva > 480 ? "*" : " " 为判断是否迟到, 迟到的后边增加标记 * , 480 为8点的分钟数 # 通过 | 将命令暂存到 | 上, 并且不会执行输出, 也不会执行sort命令, 在awk全部执行完毕后, 才会执行 total += arrival # 计算总的时间, 为了计算后边的平均到达时间 } END { close("today.art") close("sort -k 1 >> today.art") #awk中的close()指令, 语法有两种, close( filename ) 和close( 置于pipe之前的command ). 指令close( "sort -k 1 >> today.art" ) #其意思是 close 程序中置于"sort -k 1 >> today.art "之前的pipe, 并立即调用shell来执行sort命令 printf(" Average Arrival Time : %d:%d\n", arrival/NR/60, (arrival/NR)%60 ) >> "today.art" #awk中"today.art"若表示文件名, 必须使用"' 括起来, 若不适用, 会被当做变量 # 计算平均到达时间, NR是内建变量, 表示读入文件的总行数, arrival/NR/60 表示取整得到小时, (arrival/NR)%60 取余数得到分钟数; } function HM_to_M( hour, min ) { return hour*60 + min } # 自定义函数, 计算员工达到的分钟数, 与8点的分钟数480进行比较
最后通过 awk -f reformat.awk arr.dat 得到文件 today.art, 内容如下
Today is 11月 08日
===================================
ID Number Arrival Time
1005 8:12 *
1006 7:45
1008 8:01 *
1012 7:46
1025 7:27
1028 7:49
1029 7:57
1034 7:26
1042 7:59
1051 7:51
1052 8:05 *
1101 7:32
原创文章,作者:black_fish,如若转载,请注明出处:http://www.178linux.com/58585