を実行している(そしておそらくよinf
も)望ましくない結果が得られます。
通常、すべてのawk値は数値または文字列です。 nan
はどちらも特別なので(一部のawksでは)awkかそれが使用する基本的なCプリミティブは何をするかを決める必要があります。
数値をnan
と比較すると、最も賢明な選択は、数値がCANに等しくない(またはそれ以下でもない)nan
であるため常に「失敗」することになりますが、明らかにawkプロバイダによってはあなたは発見しました。私は個人的にバグだと考えていましたが、数字の理論や、それがそうでないかというとnan
の使用に関する標準の歴史については十分に分かりません。肩をすくめる。 --posix
フラグのgawkなし
は、文字列としてnan
を扱いますが、「特別な」数値として+nan
と-nan
を扱います。 --posix
gawkはnan
の基本的なC
プリミティブが実行中のシステム上にあると判断したものをそのまま扱います。これらの決定は、過去のプログラムを支援することであり、システムによって異なります。
あなたが入力NaN
とき$3==3
がfalseであるため--posix
なしgawkは今あなたのために働いていると思いますけれども、それは実際にはないので、それだけで数値比較のために0
に文字列を変換NaN
ています。
あなたの問題へのポータブルな解決策は、そうしないことです。 nan
Sを含むことができ、あなたの入力データはその後、しかし、それらを処理するようにコードを記述する場合は、例えば、それらを扱うたい:
$ awk '$3!="NaN" && $3==3' file
-101.358 80.775 3
しかしgawk --posix
は、既存のデータであなたがやりたいことになります。
$ gawk '$3==3' file
-101.358 80.775 3
$ gawk --posix '$3==3' file
-101.358 80.775 3
$ echo '1 2 NaN' | gawk '$3+0==0'
1 2 NaN
$ echo '1 2 NaN' | gawk --posix '$3+0==0'
$
と
$ gawk '{print $2 - $3}' file
77.775
78.85
80.976
81.0566
$ gawk --posix '{print $2 - $3}' file
77.775
78.85
nan
nan
:WRTは
nans
に算術演算を実行し、結果もまた、あなたのデータを
gawk --posix
を必要とし、あなたのコメントで述べたように
nan
、も持ってできること
だから、gawk --posix
はあなたが持っているデータから必要なすべての動作を提供しますが、数字に似た文字列を変換するための通常の切り捨て規則が適用されるので注意してください。
$ echo 'nanny' | gawk '{ print $1 + 0 }'
0
$ echo '+nannny' | gawk '{ print $1 + 0 }'
nan
$ echo 'nanny' | gawk --posix '{ print $1 + 0 }'
nan
また、POSIXモードでのgawkを使用すると、それのすべてのそれを取り除きそうgensub()
のような便利な拡張機能だということに注意してください。代わりにゼロに変換の数値コンテキストで使用された場合、それはnan
にマッピングされますnan
を考慮より良いアプローチはnan
に+
と接頭辞を付けることです。そうすればgawkはと認識できます--posix
のハンディキャップを必要とせずに、あなたがnanny
を書いたとき、あなたがnan
を意味考えずにのS(上記参照):要約中のSO
$ echo 'nan' | gawk '{print ($1+0==0)}'
1
$ echo 'nan' | gawk --posix '{print ($1+0==0)}'
0
$ echo '+nan' | gawk '{print ($1+0==0)}'
0
$ echo '+nan' | gawk --posix '{print ($1+0==0)}'
0
$ echo '+nan' | gawk '{print ($1+0==0), gensub(/foo/,"bar",1)}'
0 +nan
$ echo '+nan' | gawk --posix '{print ($1+0==0), gensub(/foo/,"bar",1)}'
gawk: cmd. line:1: warning: regexp constant for parameter #1 yields boolean value
gawk: cmd. line:1: (FILENAME=- FNR=1) fatal: function `gensub' not defined
$ cat file
-101.358 80.775 3
-100.187 80.850 2
-98.019 80.976 +NaN
-96.476 81.0566 +NaN
$ gawk '{print $2 - $3}' file
77.775
78.85
nan
nan
からgawk --posix
があなたの現在のデータで動作しますが、私はあなたのデータを変更することをお勧めしたいですNaN
の代わりにを使用してください。--posix
がなくてgawkで動作するので、非常に便利な拡張機能が多数あり、予期せずnan
で始まる文字列を取得することはありません。 nanny
)はnan
に変換される。
はここでは再生できません。 'awk '$ 3 == 3''はあなたが望むものを与えます。 – Kent
私は同僚の勧告にgawkをインストールすることでこの問題を解決しました。私はawkのバグの古いバージョンを使用していたと信じています。ありがとう – izzyrizzy
いずれにしても、 'awk '$ 3 == 3' file'はあなたが望むコマンドです。行全体を表示するのがawkのデフォルトの動作なので、他のすべては余計です。 – hek2mgl