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

iibxawm4  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(119)

这个问题已经有答案了

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
lmyy7pcs

lmyy7pcs1#

正如在the rust answer you linked中提到的“Grep即使在具有768 GB RAM的机器上也会耗尽内存!“所以我怀疑你也有同样的问题
将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>更好,后者显然试图一次将整个输入读取到内存中,然后查找匹配。

相关问题