Awk: преобразовать запись числа, пока я умножаю столбцы

Привет, ребята, у меня есть следующие строки:

A=3.5e30
B=4.345e40

(Файл содержит столбцы с номерами в этой нотации 1.2345678D+10)

sed 's/D/E/g' File | awk '{print $1, $6*'$A', 10^($9)*'$B', $13, $8}' > File2

Результат, который я получаю:

3.168808781403E+02 29825999184755995994350665720659968 71343531834366140263241767594070376448 ... etc

Как я могу иметь 2-й и 3-й столбцы с теми же обозначениями, что и в первом столбце? то есть,

Вместо того, чтобы: 71343531834366140263241767594070376448

Я хочу: 7.134353183436E+37

Просто чтобы вы знали ответ:

 sed 's/D/E/g' File | awk '{printf "%.12E %.12E %.12E %.12E %.12E\n", $1, $6*'$A', 10^($9)*'$B', $13,$8 }' > File2

person Nikko    schedule 11.04.2014    source источник


Ответы (4)


Если вам нужна так называемая научная нотация, используйте спецификатор формата printf и %E.

Пример:

echo 71343531834366140263241767594070376448 | awk '{printf "%E",$1}' 

Выход:

7.134353E+37
person hek2mgl    schedule 11.04.2014
comment
Хорошо, но как мне сделать это в той же строке? (и у меня разные столбцы) - person Nikko; 11.04.2014
comment
Просто используйте printf вместо print: awk '{printf "%E %E %E ...", $1, $6*'$A', 10^($9)*'$B', $13, $8 ... - person hek2mgl; 11.04.2014

Просто используйте printf() вместо print():

$ awk 'BEGIN { printf "%e\n", 282048204209482034890 }' /dev/null
2.820482e+20
person Jens    schedule 11.04.2014
comment
Спасибо, но тогда я должен сделать это в другой строке, верно? - person Nikko; 11.04.2014
comment
Ага; это просто пример, чтобы показать результат в командной строке. Нет необходимости в блоке BEGIN в вашем коде. - person Jens; 11.04.2014

есть пара проблем, которые вам нужно исправить в ваших кодах:

  • использование оболочки var в awk:

    awk -v awkVar1="$A" -v awkVar2="$B" ... '{use awkVar1 without $}' file
    
  • чтобы получить формат экспоненциальной записи, вам нужно определить формат с помощью printf, вам может пригодиться один из %E, %e, %g, %G.

person Kent    schedule 11.04.2014

person    schedule
comment
Хорошо, но как мне сделать это в той же строке? (и у меня разные столбцы) - person Nikko; 11.04.2014