Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在gawk+gensub中解析数学表达式_Regex_Bash_Awk_Printf_Gawk - Fatal编程技术网

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

Regex 在gawk+gensub中解析数学表达式,regex,bash,awk,printf,gawk,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

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

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的输出替换为printb似乎可以正常工作,找到的数字被替换,但是printf参数输出没有得到应有的解析。斯特努姆没有改变什么,我是不是错过了什么

正如您在最后所看到的,我在脚本参数$1下分配文件时也有问题。我应该将文件作为变量(如data)或显式地指向gensub中的文件

提前感谢您的帮助:

不确定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 
它将规范化空白作为副作用