所以问题是我正在尝试使用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个的计数?
答案 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
。