web-dev-qa-db-ja.com

awkのintへのキャスト

文字列をawkのintにキャストするメソッドを探しています。文字列比較をしているように見える次のものがあります

note:フィールド$5は、次の2つの形式のいずれかのパーセントです:80%または9.0%

awk '{if (substr($5,1,(length($5)-1)) >= 90) ...

だから、私がそれを次のように変更すると:

awk '{if (substr($5,1,(length($5)-1))+0 >= 90+0 ) ...

思った通りです。これは適切なキャストですか?キャストを実行するための「より良い」方法はありますか?

19
xelco52

+0だけを使用できます。変数vはパーセント値です。

$ awk -v v="80.1%" 'BEGIN{print v+0.1}'
80.2

%記号を取り除く必要はありません。

17
ghostdog74

ほとんどの新しいawksにはint()関数があります。

しかし、 'Awkプログラミング言語'で文書化されているキャストの方法は、numericValueと+0を使用して、実際のキャスト方法を示しています。この本は手元にありませんが、+0.0を使用して浮動小数点値にキャストすることもできます。

これがお役に立てば幸いです。

17
shellter

docs によると、int(x)はPOSIXに準拠しています。 (awkのすべての数値は浮動小数点であるため)数値は依然として浮動小数点数ですが、整数に切り捨てられます。


0を追加しても、文字列はintに変換されません。フロートに変換します。

The One True AWK に基づく古いawkがある場合、 macOS awk または FreeBSD awk 、マンページの下部に this が表示されます。

BUGS
     There are no explicit conversions between numbers and strings.  To force
     an expression to be treated as a number add 0 to it; to force it to be
     treated as a string concatenate "" to it.

     The scope rules for variables in functions are a botch; the syntax is
     worse.

式を強制的に数値として処理するには、それに0を追加します


浮動小数点数を気にせず、gawkがある場合は、 strtonum も使用できます


その他の情報源:

OS XバージョンのAWK、Brian Kernighanによる "The One True AWK"から派生

awkの数値はすべて浮動小数点です。

検索 "すべての演算は、ISO C規格で指定されている浮動小数点演算のセマンティクスに従います"

「awkのすべての数値は浮動小数点数です」 を検索

3
dosentmatter