我只想将文件中的所有数字削减到第五位小数。例如,我有这个文件:
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 位的数字。
您可以使用sed:
sed -E 's/([0-9]+\.[0-9]{5})[0-9]*/\1/g' file
Run Code Online (Sandbox Code Playgroud)
添加-i选项以将文件添加到位。
如果您不介意整数也被转换为浮点数,您可以使用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. 舍入选项的完整列表是up、down、from-zero(默认)、towards-zero、nearest。
您可以查看联机帮助页了解更多详细信息:
如果您想要 IEEE 754 舍入但希望它严格应用于点后超过 5 位的浮点数,那么我建议使用perl- 它可以匹配正则表达式,例如sed,但允许您将sprintf表达式应用于捕获的图案:
perl -pe 's/[+-]?\d*[.]\d{5,}/sprintf "%.5f", $&/ge' file
Run Code Online (Sandbox Code Playgroud)
像 GNU 一样sed,perl可以通过添加-i选项就地修改文件。
使用 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/