awk处理案例七--工时脚本

【场景】--工时脚本

这个是我对目前的公司上班制度;我写的工时脚本;为了确定本月工时是否足够;纯属玩弄!
需求:
  1.上班采用弹性一个小时上班打卡(8:00--9:00);8:00之前打卡;算是8:00时刻打卡;9:00之后打卡算是迟到(目前这个脚本对迟到/请假不处理)
  2.中午(12:00--13:30)是中饭时间;所以这个不计工时;
  3.下班时间从17:30开始;(17:30--18:00)是晚餐时间;也不计工时。
  4.加班到(20:30)有10块的晚餐补助!这个月的餐补有多少次?
  5.一个月要保证每天有8H;这个月的平均上班时间是多少?

worktime.awk代码如下:

 1  # 作者 li0924
 2  # 先建两个函数ttos,stot;ttos函数将时间格式转换为X分;stot函数将X分转换为时间格式
 3   function ttos(t) {split(t,a,":");b=a[1]*60+a[2]; return b}
 4   function stot(s) {i=sprintf("%02d:%02d",int(s/60),int(s%60));return i}
 5  #代码
 6   BEGIN{
 7     h=60;
 8     start1=8*h;
 9     start2=9*h;
10     end1=17.5*h;
11     end2=18*h;
12     end3=20.5*h
13   }
14   {
15     j=ttos($3);
16     k=ttos($4);
17     #对忘记打卡/迟到/早退暂不作处理;
18     if(j==0||k==0||j>start2||k<end1)
19     {
20      n++;
21     }
22     if(j<start1)
23     {
24       j=start1;
25     }
26     if(k>=end1 && k<=end2)
27     {
28        k=end1;
29        all=k-j-1.5*h;
30     }
31     if(k>end2)
32     {
33        all=k-j-2*h;
34      }
35     if(k>=end3)
36     {
37      m++;
38     }
39     sum+=all;
40     #etime为每天有效工作时间
41     etime=stot(all);
42     print $0 FS etime; 
43   }
44   END{
45     print "The average daily working hours : " stot(int(sum/(NR-n)));
46     print "This month's meal supplement: " m " time"
47   }

测试结果如下:
 kaoqing.txt

z0000019698     2013-09-01      07:23   18:23
z0000019698     2013-09-02      08:24   20:02
z0000019698     2013-09-03      08:25   20:25
z0000019698     2013-09-04      08:26   20:26
z0000019698     2013-09-05      08:27   20:17
z0000019698     2013-09-06      08:28   20:28
z0000019698     2013-09-07      08:29   20:29
z0000019698     2013-09-08      08:30   20:30
z0000019698     2013-09-09      08:31   20:31
z0000019698     2013-09-10      08:32   20:32
z0000019698     2013-09-11      08:33   20:33
z0000019698     2013-09-12      08:34   20:34
z0000019698     2013-09-13      08:35   20:35
z0000019698     2013-09-14      08:36   20:36
z0000019698     2013-09-15      08:37   20:37
z0000019698     2013-09-16      08:38   20:38
z0000019698     2013-09-17      08:39   20:39
z0000019698     2013-09-18      08:40   20:40
z0000019698     2013-09-19      08:41   20:41
z0000019698     2013-09-20      08:42   20:42
z0000019698     2013-09-21      08:43   20:43
z0000019698     2013-09-22      08:44   20:44
z0000019698     2013-09-23      08:45   20:45
View Code
[li0924@localhost awk]$ awk -f worktime.awk kaoqing.txt 
z0000019698     2013-09-01      07:23   18:23 08:23
z0000019698     2013-09-02      08:24   20:02 09:38
z0000019698     2013-09-03      08:25   20:25 10:00
z0000019698     2013-09-04      08:26   20:26 10:00
z0000019698     2013-09-05      08:27   20:17 09:50
z0000019698     2013-09-06      08:28   20:28 10:00
z0000019698     2013-09-07      08:29   20:29 10:00
z0000019698     2013-09-08      08:30   20:30 10:00
z0000019698     2013-09-09      08:31   20:31 10:00
z0000019698     2013-09-10      08:32   20:32 10:00
z0000019698     2013-09-11      08:33   20:33 10:00
z0000019698     2013-09-12      08:34   20:34 10:00
z0000019698     2013-09-13      08:35   20:35 10:00
z0000019698     2013-09-14      08:36   20:36 10:00
z0000019698     2013-09-15      08:37   20:37 10:00
z0000019698     2013-09-16      08:38   20:38 10:00
z0000019698     2013-09-17      08:39   20:39 10:00
z0000019698     2013-09-18      08:40   20:40 10:00
z0000019698     2013-09-19      08:41   20:41 10:00
z0000019698     2013-09-20      08:42   20:42 10:00
z0000019698     2013-09-21      08:43   20:43 10:00
z0000019698     2013-09-22      08:44   20:44 10:00
z0000019698     2013-09-23      08:45   20:45 10:00
The average daily working hours : 09:54
This month's meal supplement: 16 time

测试结果可以达到需求;

posted @ 2013-09-15 14:43  lottu  阅读(427)  评论(0)    收藏  举报