kim*_*221 6 bash arithmetic-expressions decimal notation
我想将以科学记数法存储的数字转换为浮点小数,这样我就可以对数据进行一些比较.这是在bash脚本中完成的 - 这是代码的一小部分:
while read track_id landfall_num gate_id pres_inter
do
if [[ $landfall_num == 0001 ]]
then
start_flag = true
echo DING DING $start_flag
if [[ $pres_inter < 97000 ]]
then
echo Strong Storm From North $track_id, $gate_id, $pres_inter
fi
fi
done < $file
Run Code Online (Sandbox Code Playgroud)
我的问题是我的<操作数基本上选择了所有压力值,当我使用时,它们以科学记数法存储<,而在我使用时则没有>.我正在研究帕斯卡而不是毫巴的大气压测量.
这是示例输出:
Strong Storm From North 0039988 0017 1.0074E+05
Strong Storm From North 0037481 0018 9.9831E+04
Run Code Online (Sandbox Code Playgroud)
这些风暴都不应该符合选择标准!
小智 10
我认为最好的方法是使用 awk。例如,对于数字“1.0074E+05”
echo "1.0074E+05" | awk -F"E" 'BEGIN{OFMT="%10.10f"} {print $1 * (10 ^ $2)}'
输出:
100740.0000000000
Run Code Online (Sandbox Code Playgroud)
显然你可以使用比十进制小数更小的精度:)
首先,bash不能使用浮点运算进行算术运算.第二件事,bash不知道科学记数法(即使是整数).
首先,你可以尝试,如果你绝对肯定你的所有数字都是整数:将它们转换为十进制表示法:printf将乐意为你做到:
printf -v pres_inter "%.f" "$pres_inter"
Run Code Online (Sandbox Code Playgroud)
(%.f舍入到最接近的整数).
然后使用bash的算法:
if (( pres_inter < 97000 )); then ....
Run Code Online (Sandbox Code Playgroud)
这个解决方案很精彩,不使用任何外部命令或任何子shell:速度和效率!
现在,如果你正在处理非整数,你最好使用bc算术:但由于它bc是迟钝的并且不能很好地处理科学记数法,所以你必须将你的数字转换为十进制表示法.所以像下面这样的事情应该做:
printf -v pres_inter "%f" "$pres_inter"
if (( $(bc -l <<< "$pres_inter<97000") )); then ...
Run Code Online (Sandbox Code Playgroud)
当然,这是因为你要求a bc.如果你对整数感到满意,那就坚持我给出的第一种可能性.
完成!
对于数字比较,您需要使用:
-eq代替==-ne代替!=-lt代替<-le代替<=-gt代替>-ge代替>=并修复一些语法问题:
while read track_id landfall_num gate_id pres_inter
do
landfall_num=$(printf "%f", "$landfall_num")
if [[ "$landfall_num" -eq 1 ]]
then
start_flag="true"
echo "DING DING $start_flag"
if [[ "$pres_inter" -lt 97000 ]]
then
echo "Strong Storm From North $track_id, $gate_id, $pres_inter"
fi
fi
done < "$file"
Run Code Online (Sandbox Code Playgroud)
更新:
这是将科学计数法数字转换为整数的方法:
printf "%.0f\n", 1.0062E+05
Run Code Online (Sandbox Code Playgroud)
例如,打印:
100620
Run Code Online (Sandbox Code Playgroud)
所以:
landfall_num=$(printf "%f", "$landfall_num")
Run Code Online (Sandbox Code Playgroud)
将从landfall_num科学记数法转换为普通的十进制整数。
| 归档时间: |
|
| 查看次数: |
13722 次 |
| 最近记录: |