Научная и общепринятая нотация в awk - PullRequest
0 голосов
/ 06 ноября 2018

Я озадачен различиями в следующих двух 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 голосов
/ 07 ноября 2018

Здесь необходимо учесть несколько моментов:

  1. Числа, написанные в научной записи вида 1,23 & times; 10 -4 лучше всего писать в электронной нотации, когда она сводится к программированию. Наиболее распространенная форма электронной нотации - 1.23E4 или 1.23e4.

    Когда вы напишите 1.23*10^4 (при условии, что ^ представляет Вычисление ), вы будете активно выполнять операцию возведения в степень, чтобы вычислить, сколько составляет 10^4, с последующим умножением двух номера. Это выглядит очень дорого, чтобы определить одно число.

  2. Умножение не связано с делением. Это означает, что a/b*c отличается от a/(b*c).

Следовательно, решение вашей проблемы таково:

  • Используйте E-обозначение:

    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
    
0 голосов
/ 06 ноября 2018

здесь

$ 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}'

, который не требует дополнительных паранов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...