我有一个文件如下:
number=49090005940;
NUMBER TRANSLATION DATA
NUMBER DATA
NUMBER TYPE SUBCOND
49090005940 IN
NUMPRE
1117230111
END
number=49090005942;
NUMBER TRANSLATION DATA
NUMBER DATA
NUMBER TYPE SUBCOND
49090005942 IN
NUMPRE
1117230111
END
我希望输出“NUMBER,TYPE和NUMPRE如下:
NUMBER=49090005940; TYPE=IN; NUMPRE=1117230111;
NUMBER=49090005942; TYPE=IN; NUMPRE=1117230111;
答案 0 :(得分:0)
这是满口的,但它有效。
awk '/number=/{split($0, a, "[=;]"); nump=a[2]} nextrec==1 && /[^ ]/{num=$0; nextrec=0} /NUMPRE/{nextrec=1} $1==nump{ty=$2} /END/{print "NUMBER="num"; TYPE="ty"; NUMPRE="nump";"}' infile
这里awk:
如果找到与"number="
匹配的记录(/number=/
,则它会以等号或分号分隔记录,并将其存储在数组a
中{{1}然后,它将数组的第二个元素放入变量split($0, a, "[=;]");
(nump
)。
如果找到包含单词nump=a[2]
(NUMPRE
)的行,则会将变量/NUMPRE/
设置为1(nextrec
)。< BR />
如果nextrec=1
设置为1且记录中不包含空格(nextrec
),请将变量nextrec==1 && /[^ ]/
设置为行(num
)。
如果该行以num=$0
(nump
)中存储的内容开头,则将该记录的第二个字段存储在变量$1==nump
(ty
)中。
最后,如果我们点击包含ty=$2
(END
)的记录,则打印所需的输出(/END/
)
答案 1 :(得分:0)
使用GNU awk进行多字符RS:
$ awk -v RS='\n\n\n' -v OFS='; ' -v ORS=';\n' '{print $7"="$10, $8"="$11, $12"="$13 }' file
NUMBER=49090005940; TYPE=IN; NUMPRE=1117230111;
NUMBER=49090005942; TYPE=IN; NUMPRE=1117230111;