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" 的英语符号?
这是一个输出示例我在一些程序中得到:
$ 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" 的英语符号?