【问题标题】:Linux shell: Changing decimal (float) separator from dot to commaLinux shell:将十进制(浮点)分隔符从点更改为逗号
【发布时间】:2015-01-04 14:41:30
【问题描述】:

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

$ 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 crowds 分隔符时,它不会改变,如:

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

【问题讨论】:

    标签: linux bash shell floating-point


    【解决方案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'
    

    【讨论】:

      【解决方案2】:

      试试这个

      $ 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
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我根本没有要求能够区分某些., 含义的程序。我只想要一种方法(别名、脚本、命令)来帮助«使用[更改]逗号,而不是.如果后面有一个或两个十进制字符»以便在我的程序中为某些数据实现它输出。
        • 您是否 100% 确定这些“某些程序”都不输出三位小数?你有他们的源代码吗?如果不是,那你就踏在薄冰上。
        • 显然。如前所述,它们是“我的程序”。无论如何,任何出于自己的目的使用此线程上的答案的人都必须确保您所说的小数点后三位规则,顺便说一句。但是,最初的问题所问的远被认为是“不可能的”。
        • 哦,天哪!如果它们是“你的程序”(你没有没有告诉我们),你为什么不以你想要的格式输出值呢?
        • 只是为了避免使原始问题过长。也许我们对“我的程序”没有使用相同的含义。它们不是我创建的程序,但它们在我的控制之下(我知道它们的行为方式)。例如,该线程已为我正在为 OCL HashCat 开发的包装器打开(开源,所以,是的,源代码可用)hashcat.net。注意截图:Speed.GPU.#1. 点之后有一个浮点数。
        【解决方案4】:

        尝试类似:

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

        【讨论】:

        • . 后面有超过 2 个十进制字符时失败,例如 Speed.Other.Thing....: 33.112 H/s
        • 我没听懂?当我运行echo "almas.shaikh.... 2.34 3.2222" | above command 我得到almas.shaikh.... 2,34 3,2222 我认为这是正确的?
        • 原帖建议:«使用逗号, 而不是.,如果它后面有一个或两个十进制字符»。三万这个数字可以写成3000030.000,但300.00 永远不会是三万,所以我们可以确定这个点. 是一个浮点分隔符,并将其更改为,。抱歉问题含糊不清。
        • 希望上面的帮助现在它会检查小数点后的一位或两位数。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-19
        • 2023-03-28
        相关资源
        最近更新 更多