web-dev-qa-db-ja.com

シーケンス小数点

浮動小数点数でseqコマンドを使用すると、入力にドットを使用しているにもかかわらず、出力には小数点の代わりにドットの代わりにコンマが含まれます。

seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3

これはLC_NUMERICに設定されているロケールde_DE.UTF-8とリンクしていると想定しましたが、en_US.UTF-8への変更では修正されず、同じロケール設定を使用している別のシステムでは修正されますドットを返します。たとえば、フォーマットを明示的に定義することさえ-f %1.2は、ドットではなくカンマを小数点記号として返します。

この動作をどこでどのように変更しますか?スクリプトが特定のシステムでエラーなしになるようにするにはどうすればよいですか? trなどを介して再処理しないと、出力は今後の処理に使用できなくなります。

ドイツ語のタイムゾーンでMintの英語のインストールを使用し、他のマシンでRaspianを使用する.


編集:指定されたマシンのlocale設定:

「コンマ」:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

「ドット」の1つ:

LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

LANGUAGEを設定しても結果には影響しません。

5
Fiximan

ロケール自体のエラーを除外するために、de_DE.UTF-8en_US.UTF-8の両方を(再)生成しました。

dpkg-reconfigure locales

そして今、seqの動作はLC_NUMERIC[〜#〜]と[〜#〜]LANGに依存しているようです。

LC_NUMERICが未設定/空の場合、LANGは動作を定義します。そうでない場合は、LC_NUMERIC betweende_DE.UTF-8en_US.UTF-8を切り替えると、それぞれカンマとドットに切り替わります。


特定の危険性

LANGに誤った値や存在しない値を設定した場合や、ドットベースではないlocaleを設定した場合など、一部の特殊なケースでは動作が混在する可能性があります。

LANG=en_US
#it should be en_US.UTF-8
LC_NUMERIC=de_DE.UTF-8

seq 0.1 0.2 1.3
0.1
0.3
0.5
0.7
0.9
1.1
1,3

seq 0.1 0.2 1.4では表示されませんが、seq 0.1 0.2 1.9でも表示されます-非常に奇妙で、非常に危険な動作です。したがって、seqの移植性に注意するか、スクリプトのロケールを定義してください。

ひどく推測すると、これは特定のケースでの手動による変更に関連しているようです(以下を参照してください: https://lists.gnu.org/archive/html/bug-coreutils/2008-09/msg00192.html


更新:

ローカライズされた出力形式によるエラーを回避するためのメンテナーの提案は、スクリプト自体でロケールを定義することです(LC_NUMERIC=C)。この動作の変更は計画されていません。 (以下のパッチ付きのリンクされたスレッドを参照)

ロケール設定が正しくないためにドットとカンマが混在して出力される問題はバグとして認識されており、メンテナによってすでにパッチが適用されています。

https://lists.gnu.org/archive/html/coreutils/2019-02/msg00002.html

4
Fiximan