解析文件中的XML但是单行?

时间:2014-12-20 00:04:41

标签: parsing awk

所以问题是我正在尝试使用AWK,Perl来查找一个xml中有多少记录,这些记录有时是兆字节中的一个loooong行。

我见过的大多数(如果不是全部)示例都假设一个很好的结构化xml,如

      <?xml version="1.0" encoding="UTF-8"?>
      <spendownrequest xmlns="http://www.foo.com/Adv/HR/SSt">
            <spenddowndata>
                            <employeeId>0002</employeeId>
                            <transactionId>103</transactionId>
                            <transactionType>T</transactionType>                            
            </spenddowndata>
            <spenddowndata>
                            <employeeId>0003</employeeId>
                            <transactionId>104</transactionId>
                            <transactionType>T</transactionType>
            </spenddowndata>
            <spenddowndata>
                            <employeeId>0004</employeeId>
                            <transactionId>105</transactionId>
                            <transactionType>T</transactionType>
            </spenddowndata>
      </spendownrequest>

每行都有换行符。这些文件就是这样的

<?xml version="1.0" encoding="UTF-8"?><spendownrequest xmlns="http://www.foo.com/Adv/HR/SSt"> <spenddowndata><employeeId>0002</employeeId><transactionId>103</transactionId> <transactionType>T</transactionType></spenddowndata><spenddowndata><employeeId>0003</employeeId> <transactionId>104</transactionId><transactionType>T</transactionType></spenddowndata><spenddowndata> <employeeId>0005</employeeId><transactionId>105</transactionId><transactionType>T</transactionType> </spenddowndata></spendownrequest>

一条长线,最后只有(1)换行符。

我试过了:

awk -F'[<|>]' '/spenddowndata/ {i++} { print i }' file.xml

回到1

我如何获得此档案中所有3个的计数?

4 个答案:

答案 0 :(得分:0)

awk 'BEGIN {RS="<"; count = 0;} { if ($0 ~ /^spenddowndata*/) {count++}} END {print(count);}'

应该有用吗?

答案 1 :(得分:0)

使用grep:

grep -o '</spenddowndata>' f | wc -l

使用awk(实际上是gawk(谢谢@EdMorton)):

gawk -v RS='</spenddowndata>' 'END{print NR-1}' f   

使用perl:

perl -n0E 's!</spenddowndata>!$i++!ge; say $i+0'

答案 2 :(得分:0)

您也可以将模式存储在文件中,比如pat.awk:

BEGIN{
    FPAT = "(<spenddowndata>)"
}

{
    print NF
}

要显示计数,请运行:

awk -f pat.awk file.xml

答案 3 :(得分:0)

awk -F'</spenddowndata>' 'END{print (NF?NF-1:0)}' file

NF的三元条件测试是避免为空文件打印-1