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
数値として解釈されます。)