如何使用awk获得结果

时间:2018-08-02 12:16:14

标签: awk

++++++++++ 输入:

EMPNO 16:    (DEP,GROUP) DEPTNO:10, GROUP:36 , AREA-CA    LOGIN TIM: loginday=10 min 30 sec loginrec=1 min 30 sec 1: working for 'advanced automation'
EMPNO 17:    (DEP,GROUP) DEPTNO:4, GROUP:1010 , AREA-CA    LOGIN TIM: loginday=9 min 30 sec loginrec=2 sec  2: working for 'vacation'

需要输出:

EMP       DEPT                   LOGIN REC                  WORKING FOR
===       ====                   =========                  ===========
EMPNO 16: DEPTNO:10, GROUP:36    1 min 30 sec 1             advanced automation
EMPNO 17: DEPTNO:4,  GROUP:1010  2 sec                      vacation

++++++++++

如何在单个命令行中仅使用awk获得输出。

基本上,您可以看到我想对输入应用一些规则(我通过在正在处理的大文件中应用awk来获得这些规则):

  1. 从第一个字段获取empno
  2. 从第二个字段获取DEPTNO,GROUP
  3. 从第三个字段中获取loginrec。
  4. 将字符串保存在一个字段中。
  5. 所有内容都应以单一缩进形式显示(尤其是在第3个字段中数据变化时,有时时间只有几秒钟,有时只有几分钟。或者是deptno和组号变化。

我通过处理一个大文件得到了输入,下面是上一步:

EMPNO 16:
    (DEP,GROUP) DEPTNO:10, GROUP:36 , AREA-CA
     LOGIN TIM: loginday=10 min 30 sec loginrec=1 min 30 sec
        working for 'advanced automation'

2 个答案:

答案 0 :(得分:2)

请您尝试以下操作(完全基于显示的示例,并且没有按照OP在预期输出中留出适当的空格)

awk '
BEGIN{
  print "EMP       DEPT                   LOGIN REC                  WORKING FOR"
}
match($0,/^EMPNO [0-9]+:/){
  EMP=substr($0,RSTART,RLENGTH)
}
match($0,/DEPTNO:[0-9]+\, GROUP:[0-9]+/){
  DEPT=substr($0,RSTART,RLENGTH)
}
match($0,/loginrec.*sec/){
  LOGIN=substr($0,RSTART+9,RLENGTH-9)
}
match($0,/working for \047.*/){
  WORKING=substr($0,RSTART+13,RLENGTH-14)
}
{
  print EMP,DEPT,LOGIN,WORKING
  EMP=DEPT=LOGIN=WORKING=""
}'  Input_file

答案 1 :(得分:2)

$ cat tst.awk
BEGIN {
    OFS="\t"
    print "EMP", "DEPT", "LOGIN REC", "WORKING FOR"
    print "===", "====", "=========", "==========="
}
{
    match($0,/loginrec=/)
    loginRec = workingFor = substr($0,RSTART+9)
    sub(/:.*/,"",loginRec)
    gsub(/^[^\047]*\047|\047[^\047]*$/,"",workingFor)
    print $1" "$2, $4" "$5, loginRec, workingFor
}

$ awk -f tst.awk file
EMP     DEPT    LOGIN REC       WORKING FOR
===     ====    =========       ===========
EMPNO 16:       DEPTNO:10, GROUP:36     1 min 30 sec 1  advanced automation
EMPNO 17:       DEPTNO:4, GROUP:1010    2 sec  2        vacation

$ awk -f tst.awk file | column -s$'\t' -t
EMP        DEPT                  LOGIN REC       WORKING FOR
===        ====                  =========       ===========
EMPNO 16:  DEPTNO:10, GROUP:36   1 min 30 sec 1  advanced automation
EMPNO 17:  DEPTNO:4, GROUP:1010  2 sec  2        vacation