我有一个数字,即123.456789,我的问题是如何在dot之后将其舍入到两位小数,所以它看起来像123.46使用sed?有任何想法吗? 或者,如何在2位小数后减少其余部分,所以最终看起来像这样:123.45? 提前谢谢!
答案 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更改为其他内容以更改舍入精度。