我有一个包含 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
解释为数字)。