Linux shell:将十进制(浮点)分隔符从点更改为逗号

时间:2015-01-04 14:41:30

标签: linux bash shell floating-point

这是一个输出示例我在某些程序中输入:

$ 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:即使这个问题要求"点后面的一个或两个数字"作为一种区分逗号为数千的方法,对于那些到此处感兴趣而没有这种限制的人(并且只要标题可以暗示它不存在),这里是@almas shaikh首先提出的方法(谢谢你,男孩) :

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

4 个答案:

答案 0 :(得分:1)

您可以使用此sed:

sed -r 's/\.([0-9]{1,2})\b/,\1/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/,\1/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})[[:>:]]/,\1/g'

答案 1 :(得分:1)

试试这个

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

答案 2 :(得分:1)

你问的是不可能的。穷人的节目如何知道像33.112这样的数字是“三万三千一百二十二”的欧洲符号还是“三十三点一二”的英语符号?

答案 3 :(得分:0)

尝试类似:

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