我有一个 6GB XML 文件,其中只有一行(使用
wc -l file.xml
进行验证)
这是我正在使用的命令:
grep -o '<wd:Report_Entry>' file.xml | wc -l
,它输出446441
。这应该是正确的命令,如https://stackoverflow.com/a/14510665/5524175所述。
正确的计数是
1521620
。令人惊讶的是,this铁锈溶液给出了正确的计数。 count_occurences '<wd:Report_Entry>' file.xml
给出 1521620
。
此外,此接受的答案中提到的以下命令也给出了
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
正如您链接的 rust 答案中提到的“即使在具有 768 GB RAM 的机器上,Grep 也会耗尽内存!”所以我怀疑你也有同样的问题。
使用 GNU awk 实现多字符 RS:
awk -v RS='<wd:Report_Entry>' 'END{print (NR ? NR : 1) - (RT ? 0 : 1)}' file
通过上面的内容,我们计算输入中 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>
的非常大的文件,后者显然会尝试一次将整个输入读入内存,然后查找匹配。