2

私は123.456789という数字を持っています.私の質問は、ドットの後にこれを小数点以下2桁に丸める方法です.sedを使用すると123.46のように見えますか?何か案は?あるいは、小数点以下 2 桁の残りを切り捨てる方法は、最終的に次のようになります: 123.45? 前もって感謝します!

4

3 に答える 3

14

実際、sedはこのためのrghtツールではないので、awkを使用する方がよいでしょう。次のようなawkスクリプトを作成します。

echo 123.45567 | awk '{printf("%.2f\n", $1)}'

またはBASHprintfを使用する:

printf "%.2f\n" 123.45567

出力:

123.46

于 2012-05-25T12:03:10.733 に答える
5

切り捨ては、次のような方法で実行できます。

pax> echo hello 123.4567 goodbye | sed 's/\(\.[0-9][0-9]\)[0-9]*/\1/g'

hello 123.45 goodbye

これは基本的に、フォームの文字列を見つけ.dd[ddd...](ここでは数字)、全体を (括弧はビットをキャプチャするように機能します)dだけに置き換えることによって機能します。.dd.dd

単純なテキスト置換ではないため、四捨五入は少し難しくなります (次の桁が 5 桁以上の場合は、最後の桁を変更して 1 を追加する必要があります)。そのためには、もう少し適応性の高いツールに頼る必要があるかもしれません。

これを行う1つの方法(最善の方法ではないことは確かですが)は次のPerlとおりです。

pax> echo hello 123.4567 9876.54321 goodbye | perl -ne '
    @x = split;
    for ($i = 0; $i <= $#x; $i++) {
        if ($x[$i] =~ /^[0-9]*\.[0-9]+$/) {
            $x[$i] = int ($x[$i] * 100 + .5) / 100;
        };
        print "$x[$i] ";
    };
    print "\n";'

hello 123.46 9876.54 goodbye

これは、目的のパターンに一致するすべてのフィールドで丸め操作を行いますが、述べたように、かなり醜いです - もっと良い方法があると確信しています (brian d foy、どこにいますか?)

于 2012-05-25T11:02:52.617 に答える
1

いずれにせよ、まだ誰も丸めを行うことができていないのでsed、Python の例を次に示します。

$ echo "echo hello 123.4567 goodbye" | python -c "import sys, re
for l in sys.stdin:
    print re.sub(r'\d*\.\d{3,}', lambda x: str(round(float(x.group()), 2)), l)"
echo hello 123.46 goodbye

2 を別のものに変更して、丸め精度を変更できます。

于 2012-05-25T12:12:07.090 に答える