2

我有一个数字,即 123.456789,我的问题是如何将其四舍五入到点后两位小数,所以使用 sed 看起来像 123.46?有任何想法吗?或者,如何在小数点后 2 位之后减少其余部分,所以最后它看起来像这样:123.45?提前致谢!

4

3 回答 3

14

实际上 sed 不是正确的工具,您最好使用 awk。像这样创建一个 awk 脚本:

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

或使用 BASH printf:

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 或更多,则必须更改最后一个数字以添加一个)。为此,您可能需要使用适应性更强的工具。

一种方法(尽管我很确定这不是最好的方法)是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 回答