AWK中的科学和通用符号

时间:2018-11-06 17:51:34

标签: awk

以下两条awk行的差异让我感到困惑:

$ cat a.txt
1
$ awk '{$2=$1/1982300000 ;$3 = $2 * 0.05}{print $1"\t"$2"\t"$3}' a.txt
1   5.04465e-10 2.52232e-11
$ awk '{$2=$1/1.98*10^09 ;$3 = $2 * 0.05}{print $1"\t"$2"\t"$3}' a.txt
1   5.05051e+08 2.52525e+07

我认为我正在用awk写指数表示法,请问您是否可以错误

2 个答案:

答案 0 :(得分:1)

这里

$ echo 1 | awk -v OFS='\t' '{print $1, a=$1/(1.98*10^9), a*0.05}' 
1       5.05051e-10     2.52525e-11

您需要添加括号,否则第二个乘法(10 ^ 9)不在分母中。

或者,您可以使用e表示法

$ echo 1 | awk -v OFS='\t' '{print $1, a=$1/1.98e9, a*0.05}'

不需要额外的餐券。

答案 1 :(得分:1)

您需要考虑以下几点:

  1. 以科学记数法表示的数字 1.23×10 -4 最好归结为编程时使用E记数法。电子注释最常见的形式是1.23E41.23e4

    在编写1.23*10^4时(假设^表示 Exponentiation ),您将主动执行幂运算以计算10^4是多少,然后是两个数字的乘积。定义单个数字看起来非常昂贵。

  2. 乘法与除法不相关。这意味着a/b*ca/(b*c)不同。

因此,解决您的问题的方法是:

  • 使用电子记号:

    awk '{$2=$1/1.98e9 ;$3 = $2 * 0.05}{print $1"\t"$2"\t"$3}' a.txt
    
  • 或添加括号:

    awk '{$2=$1/(1.98*10^9) ;$3 = $2 * 0.05}{print $1"\t"$2"\t"$3}' a.txt