在gawk + ​​gensub中解析数学表达式

时间:2017-04-25 22:42:45

标签: regex bash awk printf gawk

我尝试用科学记数法找到所有数字,并将它们替换为等效的浮点数:

gawk -F' ' '
    BEGIN {
    OFMT = "%.0f"
    data = "\
    6.54321e2\n\
    6.543212\n\
    .\n\
    454.\n\
    c. 5.54321e2\n\
    5.54321e2 1.54321e3\n\
    4.54321e2 8.34e+4\n\
    4.543212 5.54321e2\n\
    3.23e3"
    regex = "([0-9]+).([0-9]+)e([0-9]+)"
    output = gensub(regex, "\\1.\\2e\\3", "G", data)
    printf("%.3f", output)
    }' "$1"

printf("%.3f", output)替换print b似乎工作正常,它找到的数字被替换,但是printf参数output未被解析。 strtonum()没有改变任何东西,我错过了什么吗?

正如您在最后看到的那样,我在使用脚本参数$1分配文件时也存在问题。我应该像data之类的变量一样指向文件,还是gensub()中明确指出。

提前感谢您的任何帮助:)

1 个答案:

答案 0 :(得分:0)

不确定$1的用途,但您可以执行以下操作

echo "data contents here" | 
awk '{for(i=1;i<=NF;i++) if($i+0==$i) $i=sprintf("%.3f",$i)}1'

或将您的数据放入文件中并使用

awk '{for(i=1;i<=NF;i++) if($i+0==$i) $i=sprintf("%.3f",$i)}1' file 

它会将白色空间标准化为副作用。