grep 命令用于计算文件中字符串出现次数,给出较小的数字[重复]

问题描述 投票:0回答: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铁锈溶液给出了正确的计数。
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
bash shell search sed grep
1个回答
3
投票

正如您链接的 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>
 的非常大的文件,后者显然会尝试一次将整个输入读入内存,然后查找匹配。

© www.soinside.com 2019 - 2024. All rights reserved.