为什么 grep 和 Notepad++ 产生不同的结果?

为什么 grep 和 Notepad++ 产生不同的结果?

我有一个包含 6500 行和 2 列的数据文件:

1ES9 0.927536231884058 
1ET1 1.0 
1EU1 0.8915343915343915
... ... ...

我想计算文件中 1.0 的出现次数。

我使用了以下grep命令,输出为 1001:

grep -o '1.0' data_file.txt | wc -l

然后,我在windows 10下执行Notepad++的Find->Count工具。它给出了144。

为什么与 不同grep

答案1

grep用途常用表达默认情况下,“1.0”是匹配“1”后跟任意字符后跟“0”的正则表达式。在您的示例中,该行

1EU1 0.8915343915343915

将产生“1 0”的匹配。

要准确计算“1.0”的出现次数,您应该要求grep搜索固定字符串:

grep -Fo 1.0 data_file.txt | wc -l

或“转义”句点,使其与句点匹配:

grep -o '1\.0' data_file.txt | wc -l

如果您只想将 1.0 计为值,而不计子字符串 (例如在“11.002”中),您应该要求grep仅匹配单词:

grep -wo '1\.0' data_file.txt | wc -l

您不需要涉及wc其中任何一个,因为您只对每行一场比赛感兴趣,并且grep可以计算行数:

grep -cw '1\.0' data_file.txt

这仍然会匹配“-1.0”,因为“-”是非单词字符;如果这是一个问题,您可以扩展模式并停止寻找单词:

grep -c ' 1\.0$' data_file.txt

或者使用AWK等工具来匹配数值:

awk '$2+0 == 1 { c++ } END { print c }' data_file.txt

(添加 0 强制$2解释为数字)。

相关内容