Linux shell:将小数点(浮点数)分隔符从点更改为逗号

Linux shell: Changing decimal (float) separator from dot to comma

这是一个输出示例我在一些程序中得到:

$ reportspeed
Speed.GPU.#*...:   254.4 kH/s

这是另一个例子:

$ reportspeed
Speed.GPU.#*...:   254.43 kH/s

只要在这两种情况下很明显 . 点 后面的那一两个 数字是小数部分,我想改变它输出到:

$ reportspeed | decimalcomma
Speed.GPU.#*...:   254,4 kH/s
$ reportspeed | decimalcomma
Speed.GPU.#*...:   254,43 kH/s

这是:使用逗号,而不是.如果后面有一个或两个小数点。
这假设,当某些程序使用 . 点作为千位 分隔符时,它不会被更改,例如:

$ anotherprogram
Speed.Other.Thing....:   33.112 H/s
$ anotherprogram | decimalcomma
Speed.Other.Thing....:   33.112 H/s

我认为这可以通过使用 sed、awk、perl 甚至 shell 扩展来完成,但我在这方面不是很有经验。

有人可以帮我吗?

EDIT-1:即使这个问题要求 "one or two numbers behind the dot" 的解决方案作为区分数千个逗号的方法,对于那些到达这里的人来说,对这种限制不感兴趣(只要标题可以暗示)不存在),这是@almas shaikh(谢谢你,男孩)首先提出的方法:

sed 's/\([0-9]\)\.\([0-9]\)/,/g'

试试这样的东西:

sed 's/\([0-9]\)\.\([0-9]{1,2}\)/,/g' myfile.txt

你可以使用这个 sed:

sed -r 's/\.([0-9]{1,2})\b/,/g'

测试:

cat file
Speed.GPU.#*...:   254.4 kH/s
Speed.GPU.#*...:   254.43 kH/s
Speed.Other.Thing....:   33.112 H/s

sed -r 's/\.([0-9]{1,2})\b/,/g' f
Speed.GPU.#*...:   254,4 kH/s
Speed.GPU.#*...:   254,43 kH/s
Speed.Other.Thing....:   33.112 H/s

PS: 在 OSX 上使用:

sed -E 's/\.([0-9]{1,2})[[:>:]]/,/g'

试试这个

$ echo "Speed.GPU.#*...:   254.4 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,/g'
Speed.GPU.#*...:   254,4 kH/s
$ echo "Speed.GPU.#*...:   254.44 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,/g'
Speed.GPU.#*...:   254,44 kH/s
$ echo "Speed.GPU.#*...:   254.444 kH/s" |sed 's/\.\([0-9]\{1,2\}\)\b/,/g'
Speed.GPU.#*...:   254.444 kH/s

你问的是不可能的。糟糕的程序应该如何知道像 33.112 这样的数字是 "thirty-three thousand one hundred and twelve" 的欧洲符号还是 "thirty-three point one one two" 的英语符号?