awk中pipe的shell命令调用与close()

    某公司其员工到勤时间表如下, 取名为 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

(0)
black_fishblack_fish
上一篇 2016-11-11 08:41
下一篇 2016-11-11 08:41

相关推荐

  • 免费翻墙 [精]

    本人在hostus上买了一个国外的vps,花了一上午把Google给做好,可以访问g.abcdocker.com进行搜索,因为是使用nginx代理进行翻墙。网上的文章也很乱,很不好整理。 可以可以使用g.abcdocker.com上Google查阅资料。(无法观看视频) www.abcdocker.com

    2017-06-17
  • linux初期了解

    计算机的组成及其功能 计算机有运算器,控制器,存储器,输出设备和输入设备组成: 1.运算器:运算器又称算术逻辑单元(Arithmetic Logic Unit简称ALU)。它是计算机对数据进行加工处理的部件,包括算术运算2.控制器:控制器负责从存储器中取出指令,并对指令进行译码 3.存储器:存储器是计算机记忆或暂存数据的部件。 4.输入设备:输入设备是给计算…

    Linux干货 2016-10-30
  • 【招聘福利】深圳/系统运维工程师/薪资弹性,可面谈

    深圳市鑫顺诺科技有限公司 有意向的学员,请联系magedu-小助手QQ:1522609717 职位职能: 系统运维工程师岗位职责:1、公司日常机房网络和办公室网络管理调优、日常办公电脑维护。2、管理、维护网站服务器运行状态,处理系统运行故障;3、负责服务器集群的操作系统安装、升级、定制、部署与维护工作;4、负责服务器集群的系统监控和自动化脚本的设计与部署;5…

    Linux干货 2015-11-06
  • Linux中查看文本工具

    一、文件查看 文件查看命令:cat,tac,rev,我们重点详解cat命令 cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令 我们可以理解cat命令是复制标准输入到标准输出 cat命令选项: cat [OPTION]… [FILE]… -E:显示行结束符$   &nbs…

    Linux干货 2016-08-07
  • corosync的高可用——高可用mariadb数据库

    corosync, pacemaker,nfs高可用mariadb 实验环境: 4台CentOS 7 的主机,并关闭的iptalbes和selinux功能 主机1:10.1.43.101 node1 corosync+pacemaker+amp 主机2:10.1.43.102 node2 corosync+pacemaker+amp 主机3:10.1.43.…

    Linux干货 2016-11-24
  • vim文本编辑器小结

    vi=vim打开文件 alias vi =vim vim -m 只读方式打开文件 修改文件时则会无法保存   -b 二进制打开文件 -d file1 file2  比较两个文件 Command(normal)默认模式:  ZZ 保存并退出 ZQ 不保存并退出Insert:编辑模式&nbsp…

    2017-08-05