Grep

為什麼 grep 和 Notepad++ 會產生不同的結果?

  • March 20, 2022

我有一個包含 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被解釋為數字)。

引用自:https://unix.stackexchange.com/questions/692769