如何将大数转换为科学记数法

ghi*_*esZ 6 sed numeric-data text-formatting

我正在处理一个文件,其中包含非常大的值的列。

(比如 40 位数字:646512354651316486246729519751795724672467596754627.06843 等等......)

我想用科学记数法表示这些数字,但点后只有 3 或 4 个数字。有没有办法sed在我的文件中出现的每个数字上使用或做些什么?

小智 13

您的 shell 可能有一个printf可用于格式化数字的内置函数。

$ type printf
printf is a shell builtin
$ printf "%.3e\n" 646512354651316486246729519751795724672467596754627.06843
6.465e+50
$ printf "%.4e\n" 646512354651316486246729519751795724672467596754627.06843
6.4651e+50
$ _
Run Code Online (Sandbox Code Playgroud)

如果没有,通常也有一个专用的printf二进制文件。

$ which printf
/usr/bin/printf
$ _
Run Code Online (Sandbox Code Playgroud)


Sun*_*eep 9

如果您只想转换特定列,则有awk帮助

$ cat ip.txt
foo 64651235465131648624672951975 123
bar 3452356235235235 xyz
baz 234325236452352352345234532 ijkls

$ # change only second column
$ awk '{$2 = sprintf("%.3e", $2)} 1' ip.txt
foo 6.465e+28 123
bar 3.452e+15 xyz
baz 2.343e+26 ijkls
Run Code Online (Sandbox Code Playgroud)