一般関係演算子 '<' が awk で期待どおりに動作しません。

一般関係演算子 '<' が awk で期待どおりに動作しません。

次のファイルがあります。

0.2
0.2
0.2
0.2
0.2
0.2
0.2024
0.2025
0.2027
0.2027
0.2029
0.2059
0.2059
0.2059
0.2059
0.2099
0.2099
0.2099
0.2105
0.2113
0.2113
0.2195
0.2198
0.2206
0.2206
0.2206
0.2989
0.2989
0.2989
0.3
0.3

範囲に含まれる値の数を計算したいと思います。たとえば、次のようになります。

0.2 18
0.21 5
0.22 3
0.23 0
0.24 0
0.25 0
0.26 0
0.27 0
0.28 0
0.29 3
0.3 2

ご覧のとおり、私が使用した間隔は0.01です。これを実装するために使用していますが、awk奇妙な動作が発生します。

awk 'BEGIN {for (i=0;i<1.01;i+=0.01) a[i]=0} {
    for (j=0;j<=1;j+=0.01) 
      if($1>=j && $1<j+0.01) {
        a[j]+=1
      }
    } 
    END {for (k=0;k<1.01;k+=0.01) print k,a[k]}' test_OH.txt

結果:

0.19 6
0.2 12
0.21 5
0.22 3
0.23 0
0.24 0
0.25 0
0.26 0
0.27 0
0.28 0
0.29 5
0.3 0

誰でも私を助けることができますか?もちろん、何も考慮していない<ので期待通りに動作しないようです。$1 == j+0.01ありがとうございます!

ベストアンサー1

awk -v s=0.2 -v e=0.3 -v d=0.01 '
   BEGIN { m = 1/d }
   { a[int($1*m)]++ }
   END{ e *= m; for(s = int(s*m); s <= e; s++) print s*d, a[s]+0 }
' test_OH.txt

0.2 18
0.21 5
0.22 3
0.23 0
0.24 0
0.25 0
0.26 0
0.27 0
0.28 0
0.29 3
0.3 2

(スタートse(終了)およびd(増分/ステップ)変数は必要に応じて調整できます。


  1. 繰り返し加算で範囲を生成することは、0.01浮動小数点数ができないことを示すほとんどの教科書の例です。なぜなら、浮動小数点数は0.012進法で正確に表現できず、加算するたびに誤差が累積されるからです。

  2. 各ラインの全範囲をスキャンすることは非効率的で意味がない。

  3. ""awkの変数はまたはで初期化する必要はありません0

おすすめ記事