5

私が間違っていなければ、awk は OS 言語に応じて数値を解析します (たとえば、echo "1,2" | awk '{printf("%f\n",$1)}'英語のシステムでは 1 と解釈され、カンマで整数と小数部分が区切られているシステムでは 1.2 と解釈されます)。

C の printf もこれを行うかどうかわからないので、C タグを追加しました。

使用しているシステムに関係なく同じ値 (1.2) を返すように、前のコマンドを変更したいと思います。

4

2 に答える 2

8

localeの醜さへようこそ。問題を解決するには、まずロケールを C に設定します。

export LC_NUMERIC=C
echo "1,2" | awk '...your code...'

他のロケール依存のおふざけをオフにするには、次のことができます。

export LC_ALL=C
于 2012-04-25T17:04:37.050 に答える
3

を使用している場合gawkは、--use-lc-numericオプションを使用できます。

$ LC_NUMERIC=de_DE.UTF-8 awk 'BEGIN {printf("%f\n", "1,2")}'
1.000000
$ LC_NUMERIC=de_DE.UTF-8 awk --use-lc-numeric 'BEGIN {printf("%f\n", "1,2")}'
1,200000

GAWKマニュアルから

POSIX標準では、awkは、awkプログラムのソースコードを読み取るとき、およびコマンドライン変数の割り当てに常に小数点としてピリオドを使用するとしています(その他の引数を参照)。ただし、入力データの解釈、printおよびprintf出力、および数値から文字列への変換には、ローカル小数点文字が使用されます。GNU/Linuxシステムでの動作の違いを示すいくつかの例を次に示します。

 $ gawk 'BEGIN { printf "%g\n", 3.1415927 }'
 -| 3.14159
 $ LC_ALL=en_DK gawk 'BEGIN { printf "%g\n", 3.1415927 }'
 -| 3,14159
 $ echo 4,321 | gawk '{ print $1 + 1 }'
 -| 5
 $ echo 4,321 | LC_ALL=en_DK gawk '{ print $1 + 1 }'
 -| 5,321

'en_DK'ロケールはデンマークの英語用であり、コンマは小数点の区切り文字として機能します。通常の「C」ロケールでは、gawkは「4,321」を「4」として扱いますが、デンマーク語ロケールでは、完全な数値4.321として扱われます。

gawkの以前のバージョンのいくつかは、標準のこの側面に完全に準拠していました。ただし、英語以外のロケールの多くのユーザーは、データで小数点としてピリオドが使用されていたため、この動作に不満を持っていました。そのため、デフォルトの動作が復元され、小数点文字としてピリオドが使用されました。--use-lc-numericオプション(「オプション」を参照)を使用して、gawkにロケールの小数点文字を使用させることができます。--posix(gawkは、POSIXモードの場合、またはPOSIXLY_CORRECT環境変数を介して、ロケールの小数点文字も使用します。)

私はから同様の動作を取得します/usr/bin/printf

$ LC_NUMERIC=de_DE.UTF-8 /usr/bin/printf "%f\n" "1,2"
/usr/bin/printf: 1,2: value not completely converted
1,000000
$ LC_NUMERIC=de_DE.UTF-8 /usr/bin/printf "%f\n" "1.2"
1,200000

しかし、それをオーバーライドする機能はありません。

逆のこと、つまり「ヨーロッパ」の入力と「米国」の数値を出力することを目的としている場合は、より堅牢なものを使用する必要があります。可能性のあるPythonまたはPerlとそのロケールモジュール。

于 2012-04-25T19:16:20.567 に答える