如何使用awk获得结果

如何使用awk获得结果,awk,Awk,++++++++++ 输入: 所需产出: EMP DEPT LOGIN REC WORKING FOR === ==== ========= =========== EMPNO 16: DEPTNO:10, GROUP:36 1 min 30 sec 1 advanced automation EMPNO

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

所需产出:

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获得):

  • 从第一个字段获取empno
  • 从第二个字段获取DEPTNO,GROUP
  • 从第三个字段获取loginrec
  • 在一个字段中获取字符串
  • 所有内容都应该以单个缩进(特别是当数据在第三个字段中变化时,有时时间仅以秒为单位,有时以分钟为单位,或者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'
    

    请尝试以下内容。(完全基于所显示的样本,没有按照OP在预期输出中显示的适当空间)


    请尝试以下内容。(完全基于所显示的样本,没有按照OP在预期输出中显示的适当空间)


    这些是制表符分隔的字段吗?不完全是,请参阅我的上一次编辑。我是通过连接上一步得到输入的。在该步骤中,文本前有空格,用于几行,这就是这些制表符分隔的字段得到的。不完全是,请参阅我的上一次编辑。我是通过连接上一步得到输入的。在该步骤中ep文本前有空格,只有几行,这就是它的工作原理,如何在其中获得缩进/格式?@Sach,需要处理它,在我的晚餐后会看到:)也看到一次此链接在有人回复你的答案后应该怎么做SO/。它工作,如何将缩进/格式也包含在其中?@Sach,需要处理它,在我的晚餐后将看到:)也查看一次此链接在SO/上有人回复你的答案后应该怎么做。
    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'
    
    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
    
    $ 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