#!/bin/shで数字を分割し、浮動小数点として返す方法

#!/bin/shで数字を分割し、浮動小数点として返す方法

こんにちは、2つの数字を分割する必要があります。#!/bin/sh

$x = 5678
$x/1000

ただし、計算は整数のみを返します5

私はする必要があります5,678

頑張った

$x/1000.0 
$x/1000.0 | bc

最初の方法は整数を期待します

2番目の方法:1つもありませんbc

答え1

あなたはそれを使用することができますawk

#! /bin/sh -
x=5678 y=1000
awk -- 'BEGIN{printf "%.3f\n", ARGV[1]/ARGV[2]}' "$x" "$y"

これを取得するかどうかは、ロケール5.6785,678、、、$LC_ALL変数)と実装(一部はロケールに関係なく使用されます)によって異なります。$LC_NUMERIC$LANGawk.

GNU実装の場合は、ロケールの10進基本文字に従うように変数をその環境に渡すawk必要があります。POSIXLY_CORRECT

これは数値入力にも当てはまります。

$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1,2 10
0,120
$ LC_ALL=fr_FR.UTF-8 POSIXLY_CORRECT=1 gawk -- 'BEGIN{
   printf "%.3f\n", ARGV[1]/ARGV[2]}' 1.2 10
0,100

(後者の場合は、文字列を数値に明示的に変換するとき(ここで算術演算子を使用する場合など)、有効な数値を生成して無視する限り、できるだけ多く解析するためと解釈され1.2ます。同じです。フランス語のロケールでは、代わりに小数点があるため理解できません。1/awk.2,.

Byboxの実装では、オプションではなく引数の後にオプションを受け入れるため、POSIXと互換性がないため、--オプションの終わりを表示するには使用する必要があります。awkそれがなければ、$xorが負の$y数であれば、上記の方法は機能しません。

またはリセットすることができます。$POSIXLY_CORRECTこれにより、標準的な方法でオプションを解析できます。 busyboxはawkロケール.$POSIXLY_CORRECT

答え2

次のdcコードスニペットを使用して結果を取得できます。

$ dc -e "3k $x 1000/p"

関連情報