基于分隔符的合并记录-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
--
希望得到以下信息
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
}
}
我看没有问题。。。