【问题标题】:Awk: Convert notation of a number while I multiply columnsawk:在乘列时转换数字的表示法
【发布时间】:2014-04-11 11:07:15
【问题描述】:

大家好,我有以下几行:

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

如何使第二列和第三列的符号与第一列中的符号相同?即,

而不是: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

【问题讨论】:

    标签: awk scientific-notation


    【解决方案1】:

    如果您想要所谓的科学记数法,请使用 printf 和 %E 格式说明符。

    例子:

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

    输出:

    7.134353E+37
    

    【讨论】:

    • 很好,但我如何在同一行中做到这一点? (而且我有不同的专栏)
    • 只用 printf 代替 print:awk '{printf "%E %E %E ...", $1, $6*'$A', 10^($9)*'$B', $13, $8 ...
    【解决方案2】:
    awk 'BEGIN { printf("%E\n", 71343531834366140263241767594070376448); }'
    7.134353E+37
    

    【讨论】:

    • 很好,但我如何在同一行中做到这一点? (而且我有不同的专栏)
    【解决方案3】:

    只需使用printf() 而不是print()

    $ awk 'BEGIN { printf "%e\n", 282048204209482034890 }' /dev/null
    2.820482e+20
    

    【讨论】:

    • 谢谢,但我必须换行,对吧?
    • 是的;这只是在命令行上显示结果的示例。您的代码中不需要 BEGIN 块。
    【解决方案4】:

    您需要在代码中解决几个问题:

    • shell var 在 awk 中的使用:

      awk -v awkVar1="$A" -v awkVar2="$B" ... '{use awkVar1 without $}' file
      
    • 要获得科学记数法格式,您需要使用printf 定义格式,%E, %e, %g, %G 之一对您有用。

    【讨论】:

      猜你喜欢
      • 2021-04-24
      • 1970-01-01
      • 2020-03-27
      • 2010-10-21
      • 1970-01-01
      • 2023-01-14
      • 2016-05-13
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多