如何将e-05等科学计数法转为小数?curl+jq解析场景的转换方案
我来帮你搞定这个科学计数法转小数的问题!不管是你用curl+jq遇到的输出格式问题,还是需要用sed/awk替代,都有现成的解决方案。
用 jq 直接解决科学计数法转小数
当你用jq解析后得到科学计数法格式的数字(比如1.23e-05),其实jq自带了格式化工具,直接用@printf就能转成你要的小数格式:
基础转换:如果想保留固定位数的小数,比如保留7位(对应
0.0000123),可以这样写:curl [你的URL] | jq '.目标字段 | @printf "%.7f"'这里的
%.7f表示保留7位小数,你可以根据实际需要调整数字(比如要0.0000的格式就用%.4f,但注意这样会截断后面的有效数字)。去掉末尾多余的零:如果不想保留末尾的无效零,可以在格式化后再加个替换处理:
curl [你的URL] | jq '.目标字段 | @printf "%.7f" | gsub("\\.0+$|(\\.[0-9]*[1-9])0+$"; "\\1")'这个命令会把
0.0000123000变成0.0000123,如果是0.0000000则会变成0。
用 sed/awk 的替代方案
如果jq的方法不符合你的需求,或者你更习惯用sed/awk,这里也有可行的办法:
awk 方案(推荐,更可靠)
awk能直接识别科学计数法,用sprintf格式化非常方便:
# 基础转换,保留7位小数 curl [你的URL] | jq '.目标字段' | awk '{printf "%.7f\n", $0}' # 自动去掉末尾无效零 curl [你的URL] | jq '.目标字段' | awk '{ val = sprintf("%.7f", $0) sub(/\.?0+$/, "", val) print val }'
sed 方案(稍复杂,依赖bc命令)
sed处理科学计数法需要手动计算指数,适合简单的e-xx格式(比如e-05):
curl [你的URL] | jq '.目标字段' | sed -E ' /e-/{ s/^([0-9]+)\.([0-9]+)e-0?([0-9]+)/\1|\2|\3/ s/([0-9]+)\|([0-9]+)\|([0-9]+)/echo "0.$(printf "%0*d" $((\3-1)) 0)\1\2"|bc/e s/\.0+$// s/(\.[0-9]*[1-9])0+$/\1/ } '
这个脚本会把1.23e-05转换成0.0000123,不过注意它只处理e-的情况,如果有e+的格式需要额外调整。
内容的提问来源于stack exchange,提问作者David




