这个问题已经有答案了:
How can I count the number of elements in an XML document using xmlstarlet in BASH?(1个答案)
上个月关门了。
我有一个6GB的XML文件,只有一行(用wc -l file.xml
验证)
这是我使用的命令:grep -o '<wd:Report_Entry>' file.xml | wc -l
,它输出446441
。这应该是在https://stackoverflow.com/a/14510665/5524175中提到的正确命令。
正确的计数是1521620
。令人惊讶的是,this rust 解决方案给出了正确的计数。count_occurences '<wd:Report_Entry>' file.xml
得到1521620
。
另外,this accepted answer中提到的以下命令也给出了446441
。
sed 's/<wd:Report_Entry>/<wd:Report_Entry>\n/g' file.xml | grep -c "<wd:Report_Entry>"
我不知道我错过了什么。像< or > or :
这样的转义字符?我在macOS上。这是我的grep版本。
➜ ~ grep --version
grep (BSD grep, GNU compatible) 2.6.0-FreeBSD
1条答案
按热度按时间lmyy7pcs1#
正如在the rust answer you linked中提到的“Grep即使在具有768 GB RAM的机器上也会耗尽内存!“所以我怀疑你也有同样的问题
将GNU awk用于多字符RS:
通过上面的操作,我们计算了输入中
whatever...<wd:Report_Entry>
“记录”的数量。(NR ? NR : 1)
是为了确保在后续的减法之后,我们不会最终得到空输入文件的-1
。- (NR ? 1 : 0)
是这样的,所以我们不计算输入中最后一个<wd:Report_Entry>
之后的字符串(输入foo...<wd:Report_Entry>...bar
应该报告1
,而不是2
)。由于上面的代码是阅读每个
<wd:Report_Entry>
分隔的字符串,一次一个,它将处理包含多个<wd:Report_Entry>
的非常大的文件,这比grep -o '<wd:Report_Entry>
更好,后者显然试图一次将整个输入读取到内存中,然后查找匹配。