将数字切割成特定的小数

Esl*_*aad 6 command-line

我只想将文件中的所有数字削减到第五位小数。例如,我有这个文件:

Ga O # 83645, Ga2O3                     
1.0
       12.2348604202         0.0000000000         0.0000000000
        0.0000000000         3.0320000648         0.0000000000
       -1.3752052829         0.0000000000         5.6183021388
   Ga    O
    8   12
Direct
     0.590021042         0.500000000         0.794251030
     0.409978979         0.500000000         0.205748985
     0.909978943         0.000000000         0.205749006
     0.090021023        -0.000000000         0.794251030
     0.658887031         0.000000000         0.314083014
Run Code Online (Sandbox Code Playgroud)

所以,我想拥有相同的文件,但只有小数点后 5 位的数字。

pLu*_*umo 7

您可以使用sed

sed -E 's/([0-9]+\.[0-9]{5})[0-9]*/\1/g' file
Run Code Online (Sandbox Code Playgroud)

添加-i选项以将文件添加到位。


ste*_*ver 6

如果您不介意整数也被转换为浮点数,您可以使用numfmt

$ numfmt --field=1- --format=%.5f --invalid=ignore < file
1.00000
            12.23487              0.00000              0.00000
             0.00000              3.03201              0.00000
            -1.37521              0.00000              5.61831
   Ga    O
8.00000 12.00000
Direct
         0.59003             0.50000             0.79426
         0.40998             0.50000             0.20575
         0.90998             0.00000             0.20575
         0.09003             0.00000             0.79426
         0.65889             0.00000             0.31409
Run Code Online (Sandbox Code Playgroud)

解释

  • --field=1-

    此选项指示numfmt需要替换哪些事件。1-在这种情况下,意味着从第一次出现到行尾。

  • --format=%.5f

    此选项说明numfmt如何格式化输出数字。%.5f在这种情况下意味着将它们格式化为带有 5 个十进制数字的浮点数。

  • --invalid=ignore

    此选项告诉numfmt在无法格式化数字时该怎么做。ignore在这种情况下,只会忽略有问题的输入并继续下一个输入。

默认情况下,numfmt应用IEEE 754 舍入规则- 如果您想要简单的截断,您可以添加--round=towards-zero. 舍入选项的完整列表是updownfrom-zero(默认)、towards-zeronearest

您可以查看联机帮助页了解更多详细信息:


如果您想要 IEEE 754 舍入但希望它严格应用于点后超过 5 位的浮点数,那么我建议使用perl- 它可以匹配正则表达式,例如sed,但允许您将sprintf表达式应用于捕获的图案:

perl -pe 's/[+-]?\d*[.]\d{5,}/sprintf "%.5f", $&/ge' file
Run Code Online (Sandbox Code Playgroud)

像 GNU 一样sedperl可以通过添加-i选项就地修改文件。


sch*_*ity 5

使用 GNU sed

sed -E 's/\.([0-9]{5})[0-9]*/.\1/g' file
Run Code Online (Sandbox Code Playgroud)

输出:

1.0
       12.23486         0.00000         0.00000
        0.00000         3.03200         0.00000
       -1.37520         0.00000         5.61830
   Ga    O
    8   12
Direct
     0.59002         0.50000         0.79425
     0.40997         0.50000         0.20574
     0.90997         0.00000         0.20574
     0.09002        -0.00000         0.79425
     0.65888         0.00000         0.31408
Run Code Online (Sandbox Code Playgroud)

使用扩展正则表达式-E

sed -E


将模式.<five digits><n digits>\.([0-9]{5})[0-9]*. 捕获点后面的5位数字.([0-9]{5})

s/\.([0-9]{5})[0-9]*/
Run Code Online (Sandbox Code Playgroud)

用点.和捕获的模式替换匹配:

/.\1/