sed将数字舍入为2位小数

use*_*172 1 sed decimal rounding

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

anu*_*ava 12

实际上sed不是最好的工具,你应该更好地使用awk.像这样创建一个awk脚本:

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

或使用BASH printf:

printf "%.2f\n" 123.45567
Run Code Online (Sandbox Code Playgroud)

OUTPUT:

123.46


pax*_*blo 5

截断它可以通过以下方式完成:

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

hello 123.45 goodbye
Run Code Online (Sandbox Code Playgroud)

这基本上是通过查找形式的字符串.dd[ddd...](其中d是数字)并将整个内容替换为.dd(括号用于捕获.dd位)来实现的。

舍入它有点困难,因为它不是简单的文本替换(如果下一个数字是五个或更多,您必须更改最后一个数字以添加一个)。为此,您可能需要使用适应性更强的工具。

一种方法(虽然我很确定这不是最好的方法)是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
Run Code Online (Sandbox Code Playgroud)

这对匹配所需模式的每个字段执行舍入操作,但如上所述,它非常丑陋 - 我相信有更好的方法(brian d foy,你在哪里?)