sed将数字舍入为2位小数

时间:2012-05-25 10:53:37

标签: sed rounding decimal

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

3 个答案:

答案 0 :(得分:12)

实际上sed不适合这个,你应该更好地使用awk。像这样创建一个awk脚本:

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

或使用BASH printf:

printf "%.2f\n" 123.45567

输出:

123.46

答案 1 :(得分:4)

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

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位)。

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

实现此目的的一种方式(尽管我很确定它不是最佳方式)与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,你在哪里?)

答案 2 :(得分: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更改为其他内容以更改舍入精度。