我需要一些帮助,我有一些xml请求,我想解析它们。
[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <?xml version="1.0"?><COMMAND><TYPE>CBRSRESP</TYPE><TXNID>AN160308.0000.S12547</TXNID><TXNSTATUS>00018</TXNSTATUS><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"
[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <COMMAND><TYPE>CBRSRESP</TYPE><TXNID>AN160308.0000.S12547</TXNID><TXNSTATUS>00018</TXNSTATUS><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"
[2016-03-08 00:00:01,000][http-nio-00.000.00.0-0000-exec-00] - <?xml version="1.0"?><COMMAND><TYPE>CBRSRESP</TYPE><TXNSTATUS>00018</TXNSTATUS><TXNID>AN160308.0000.S12547</TXNID><BALANCE></BALANCE><MESSAGE>LTRX FAIL</MESSAGE><FRBALANCE>0.0</FRBALANCE><TRID>2222277203602010000S46613</TRID><TXNMODE></TXNMODE></COMMAND>"
我想按照以下格式解析这些xml请求。
TRID,TXNID,TXNSTATUS
例如。
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
答案 0 :(得分:0)
使用GNU awk:
awk '{print gensub(/.*<TRID>(.*)<\/TRID>.*/,"\\1","g")","gensub(/.*<TXNID>(.*)<\/TXNID>.*/,"\\1","g")","gensub(/.*<TXNSTATUS>(.*)<\/TXNSTATUS>.*/,"\\1","g")}' file
有关gensub
的更多信息答案 1 :(得分:0)
这是一个使用GNU awk 4. * for FPAT
的简单方法,它可以轻松扩展,以任何顺序打印其他字段,只需按名称引用它们:
$ awk -v FPAT='<[^>]+>|[^<>]+' -v OFS=, '{for (i=1;i<=NF;i++) f[$i]=$(i+1); print f["<TRID>"], f["<TXNID>"], f["<TXNSTATUS>"] }' file
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
2222277203602010000S46613,AN160308.0000.S12547,00018
如果你想处理一些可以为空的字段(例如BALANCE),你只需要将f[<name>]
的赋值作为三元表达式来检查下一个{{1之前是否有文本行上的字符串:
<...>