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