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

标签 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

这是:使用逗号,代替如果后面有一个或两个小数字符。
这假设,当某些程序使用 . dots for thousands 分隔符时,它不会被更改,如:

$ 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'

最佳答案

你可以使用这个 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'

关于Linux shell : Changing decimal (float) separator from dot to comma,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27766627/

相关文章:

bash - 将数据格式化为表格格式

bash - 为什么在命令替换中输入重定向的工作方式不同?

bash - 解析程序的标准输出并在完成后将其杀死

linux - 如何通过 ssh 执行命令并将值存储在变量中

bash - Bash 运算符 <<<(即三倍小于号)是什么意思?

linux - 如何在没有查找的情况下在 linux shell 脚本中根据日期查找和删除文件?

linux - 'find' 找不到文件,可能是什么原因?

linux - 获取 KSH 名称

linux - 使用对话框实用程序保存文件

linux - Shell:目录中的/和//有区别吗?