在bash中将十进制转换为特定的科学记数法

时间:2013-11-07 20:22:41

标签: bash numbers

问题

我想知道如何执行以下转换:0.00001234560.123456e-04

我的第一个方法是:

printf "%0.6e\n" 0.0000123456

但是,此命令返回:

1.234560e-05

非常感谢您提供任何帮助。

VAR3VAR4是数字,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

1 个答案:

答案 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,我就是这样做的。