问题
我想知道如何执行以下转换:0.0000123456
到0.123456e-04
我的第一个方法是:
printf "%0.6e\n" 0.0000123456
但是,此命令返回:
1.234560e-05
非常感谢您提供任何帮助。
解
VAR3
和VAR4
是数字,D
数字,VAR1
是文件名1,VAR2
是文件名2.
D=`awk -v a="$VAR3" -v b="$VAR4" 'BEGIN{printf "%.6e", (a - b)}'`
case ${D:0:1} in
[1234567890] )
EXP=`echo "${D:11:2} - 1" | bc`
if [ "${#EXP}" -eq 1 ]
echo "0.${D:0:1}${D:2:-4}D${D:10:1}0$EXP" >> $VAR1\_$VAR2
else
echo "0.${D:0:1}${D:2:-4}D${D:10:1}$EXP" >> $VAR1\_$VAR2
fi
;;
-)
EXP=`echo "${D:12:2} - 1" | bc`
if [ "${#EXP}" -eq 1 ]
echo "0.${D:0:2}${D:3:-4}D${D:11:1}0$EXP" >> $VAR1\_$VAR2
else
echo "0.${D:0:2}${D:3:-4}D${D:11:1}$EXP" >> $VAR1\_$VAR2
fi
;;
esac
答案 0 :(得分:1)
这看起来不像标准的科学记谱法,所以我不知道任何Unix工具默认会这样做...但是,根据你的要求,你可能会使用一些恶心的Bash:< / p>
format() {
local num="$1"
local prefix="${num%%.*}"
if [[ "$prefix" == "" ]]; then
prefix="0"
fi
local suffix="${num#*.}"
if [[ "${suffix}" == "${num}" ]]; then
suffix="0"
fi
if [[ "$prefix" -ne 0 ]]; then
echo "$prefix.$suffix"
return 0
fi
local without_zeros="${suffix}"
local num_zeros=0
while [[ "${without_zeros:0:1}" == "0" ]]; do
without_zeros="${without_zeros#0}"
(( num_zeros += 1 ))
done
if [[ "$num_zeros" -eq 0 ]]; then
echo "$prefix.$suffix"
else
echo "0.${without_zeros}e-$(printf "%02d" "$num_zeros")"
fi
}
format "0.0001234000" # 0.1234e-03
format "0.0001234" # 0.1234e-03
format "0.1234" # 0.1234
format "1.1234" # 1.1234
format "01.1234" # 01.1234
format "1234" # 1234.0
format "01234" # 01234.0
format ".1234" # 0.1234
现在......我不确定我是否推荐这样做,因为使用像Python这样稍微更高级别的语言可能更有意义......但是如果你需要从shell,我就是这样做的。