Grep
為什麼 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
?
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
被解釋為數字)。