- 论坛徽章:
- 39
|
本帖最后由 关阴月飞 于 2013-07-16 17:38 编辑
回复 7# zooyo
版主强大!学习了,根据思路,加了几个判断,以防出现打卡早退现象时不会计算工时:- #!/usr/bin/awk -f
- #定义函数:将时间格式输入转换成数值输出
- function atoi(s){split(s,a,":");return a[1]*3600+a[2]*60+a[3]}
- #定义函数:数值输入转为时间格式输出
- function itoa(n){i=sprintf("%02d:%02d:%02d",int(n/3600),int(n%3600/60),n%60);return i}
- #设置上午工作时间start_s --> end_s, 下午工作时间 start_x --> end_x,加班开始时间 ot
- BEGIN{h=3600; start_s=8*h; end_s=12*h; start_x=13.5*h; end_x=17.5*h; ot=18*h}
- {
- #获取上班打卡记录$2 下班打卡记录$3, 并使用自定义函数转换成数值
- j=atoi($2);
- k=atoi($3);
- #如果存在上班提前打卡(即上班打卡时间早于start_s(8:00)),则将打卡时间设为8:00
- if(j<start_s)
- j=start_s;
- #判断是否存在早退(分开上下午两个时间段及是否加班分别判断)
- #上午班判断
- #如果早于end_s 12:00打下班卡,直接计算工时.
- if (k<=end_s){
- sum+=k-j;
- print $0,itoa(k-j);
- next;
- }
- #如果在start_x 13:30 之前打下班卡,将下班打卡时间设为12:00
- if (k<=start_x){
- k=end_s
- sum+=k-j;
- print $0,itoa(k-j);
- next;
- }
-
- #下午班判断
- #如果在end_x 17:30 或之前打下班卡,计算工时时减去午休时间 1.5h
- if (k<=end_x){
- sum+=k-j-1.5*h;
- print $0,itoa(k-j-1.5*h);
- next;
- }
- #如果在ot 18:00 或之前打下班卡,将下班打卡时间设为17:30 且计算工时时减去1.5h
- if (k<=ot){
- k=end_x
- sum+=k-j-1.5*h;
- print $0,itoa(k-j-1.5*h);
- next;
- }
-
- #加班判断
- # 如果在ot 18:00 之后打下班卡,视为加班, 计算工时时减去2h
- if(k>ot){
- sum+=k-j-2*h;
- print $0,itoa(k-j-2*h);
- }
- }
- END{
- print "avg: "itoa(int(sum/NR))
- }
复制代码 |
|