0

问题

我想知道如何执行以下转换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
4

1 回答 1

1

这看起来不像标准的科学记数法,所以我不知道有任何 Unix 工具会默认执行此操作……但是,根据您的要求,您可以使用一些令人作呕的 Bash:

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 中执行此操作,我会这样做。

于 2013-11-07T20:48:42.083 回答