我有一个积分值:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
2400000
我将它分配给 shell 变量:
CPU_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
我想使用 bash 从 shell 脚本中以科学格式显示它。此外,我需要将它用作程序的参数。这就是我想要的:
echo $CPU_FREQ
2.4+1e9
网上有一些热门内容,但对我来说如何修改它们并不明显,因为我通常使用 C/C++/Objective C。请参见,例如,bash以科学记数法显示积分和删除科学计数法 bash 脚本。
有没有办法将积分转换为科学记数法?
或者如何显示数值的科学计数法?
答案1
这应该很简单:
printf "%g" $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq)
或者,使用 perl:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | perl -e 'printf("%g\n", <>)'
您请求的格式似乎有点奇怪,但这两个示例将使用科学记数法打印数字。
答案2
事实上,正如@Jan 提到的,您可以将 printf 与 %e 一起使用。 @Will 提到了选项 %g,但这不一定是科学计数法(见下文)。
它基于您已经知道的 C 的 printf 。
CPU_FREQ=$(printf "%e" $(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq))
printf 命令的工作原理如下:
var=1
printf "print a float variable %f, or an integer literal. %d" $var 2
您可以使用 %g、%e、%G 或 %E。另外,还可以使用可选的额外文字整数参数 a,b,例如:%a.bf
简而言之,可选参数 a 是最小宽度大小(如果在变量中转发输出,则忽略该参数)。
%.be 精确地使用 b 位小数打印它,如有必要,则用零对填充进行四舍五入。 %.bg 打印带有 b 位有效数字的结果,忽略所有尾随零。 (它也可以被认为是 %f 和 %e 两个之间较短的一个,但再次值得注意的是,它没有尾随零。)
例子:
R=10000001
printf "%e\n" $R
1.000000e+07
printf "%g\n" $R
1e+07
R=1.0000001
printf "%e\n" $R
1.000000e+00
printf "%g\n" $R
1
R=1000000.1
printf "%e\n" $R
1.000000e+06
printf "%g\n" $R
1e+06
R=.10000001
printf "%e\n" $R
1.000000e-01
printf "%g\n" $R
0.1
(%G 和 %E 就像 %g 和 %e 一样,但它们以大写形式打印输出,这只适用于变成 E 的 e。)