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」の一致が生成されます。

grep「1.0」の発生回数を正確に計算するには、固定文字列の検索を要求する必要があります。

grep -Fo 1.0 data_file.txt | wc -l

または、ピリオドと一致するようにピリオドを「エスケープ」します。

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

部分文字列以外の値で1.0のみを計算したい場合(例えばgrep「11.002」)では、単語のみを一致させるように要求する必要があります。

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

wc行ごとに1つの一致にのみ興味があり、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数値として解釈されます。)

おすすめ記事