基于分隔符的合并记录-Linux

基于分隔符的合并记录-Linux,linux,awk,sed,Linux,Awk,Sed,需要根据以下标准分析文件并创建新文件: 这是示例源数据 TTTTT001:866: $READ #R1 FILE (TEST-ACCOUNTS) LOGICAL 00085100 TTTTT001-867- USING DESCRIPTOR (COMM-ACCOUNTS) 00085200 TTTTT001-868- STARTING

需要根据以下标准分析文件并创建新文件:

这是示例源数据

TTTTT001:866:           $READ #R1         FILE (TEST-ACCOUNTS) LOGICAL               00085100
TTTTT001-867-            USING DESCRIPTOR (COMM-ACCOUNTS)                            00085200
TTTTT001-868-            STARTING FROM COMM-ACCOUNTS = WS-ACCT-KEY                   00085300
TTTTT001-869-            RECORD (TEST-ACCOUNTS) RELEASE(NO).                         00085400
TTTTT001-870-                                                                        00085500
TTTTT001-871-           IF NOT (LAST-RESPONSE-CODE = 0 OR 3)                         00085600
TTTTT001-872-             MOVE 122 TO ERROR-ABEND-CODE                               00085700
TTTTT001-873-             PERFORM ZT-ERROR.                                          00085800
--
TTTTT001:1018:           $READ #R3         FILE (TEST-ACCOUNTS)                       00100300
TTTTT001-1019-                              ISN (R1-ISN)                              00100400
TTTTT001-1020-                           RECORD (TEST-ACCOUNTS)                       00100500
TTTTT001-1021-                          RELEASE (NO) HOLD.                            00100600
TTTTT001-1022-                                                                        00100700
TTTTT001-1023-           IF LAST-RESPONSE-CODE NOT = 0                                00100800
TTTTT001-1024-              OR R3-ISN NOT = R1-ISN                                    00100900
TTTTT001-1025-             MOVE 122 TO ERROR-ABEND-CODE                               00101000
--
希望得到以下信息

  • 每个部分由--(来自grep的结果)标识
  • 删除显示在每行末尾的数字
  • 拆下安装后的管路。直到--
  • 合并从$READ开始的文本,直到。排成一行
  • 所以输出应该是这样的

    TTTTT001:866:           $READ #R1         FILE (TEST-ACCOUNTS) LOGICAL USING DESCRIPTOR (COMM-ACCOUNTS) STARTING FROM COMM-ACCOUNTS = WS-ACCT-KEY RECORD (TEST-ACCOUNTS) RELEASE(NO).
    --
    TTTTT001:1018:           $READ #R3         FILE (TEST-ACCOUNTS) ISN (R1-ISN) RECORD (TEST-ACCOUNTS) RELEASE (NO) HOLD.                    
    --
    

    您可以尝试此sed命令并获得确切的结果

    sed -nr '/[T]+[0-9]+:/{:a;N;/\n--/{p;d;t};/\n.*\./{s/(.*) .*\n[^ ]+-(.*) .*/\1 \2/g;s/ +/ /g;p;d;t};s/(.*) .*\n[^ ]+-(.*) .*/\1 \2/g;s/ +/ /g; t a;}' FileName
    

    将以下代码另存为
    sed.in
    ,然后将文件名
    sed-nr-f sed.in
    。它适用于我的Ubuntu14.04和GNU-sed版本4.2.2上的示例输入

    我已经在这个脚本中添加了注释,以防您想理解并根据自己的需要修改它。检查您是否想学习如何使用sed

    s/[ \t]*[0-9]*$//;h         # remove trailing number and space, then save it to hold space
    :back                       # label
    n                           # next line
    s/[ \t]*[0-9]*$//           # remove trailing number and space
    s/TTTTT[^ ]*[ \t]+(.*$)/\1/ # remove heading and spaces
    /\.$/ !{                    # if it's not the line end with '.', append it to hold space
        H
        bback                   # jump to label back
    }
    /\.$/ {                     # line end with '.'
        H                       # append
        :aa                     # label
        n                       # get next line
        /^--/ !baa              # if it's not line start with '--' skip it
        /^--/ {
            x                   # swap hold space and pattern space
            s/\n/ /g;p          # substitute \n with space and print it
            s/^.*$//            # empty pattern space
            x                   # swap space
            b                   # get into next cycle
        }
    }
    

    我看没有问题。。。