【问题标题】:awk - piping string to external gfortran-built executable in unixawk - 在 unix 中将字符串传递到外部 gfortran 构建的可执行文件
【发布时间】:2018-10-19 12:15:01
【问题描述】:

我有以下 awk 脚本“create_grid.awk”,它将命令通过管道传输到外部 exe(使用 gfortran 构建的 iri_win.exe/iri_unix.exe)并通过 getline 读回响应(使用两个嵌套的 for 循环)。虽然在 Windows 中一切都像魅力一样工作,但在 unix 环境中却出了问题。

!/bin/awk -f 
BEGIN {

       is_windows = 0;
       if (index(tolower(ENVIRON["OS"]), "windows") > 0) {
        is_windows = 1;
      }

      exit 
}


 {

 }

 END {

mystring=""
#myvar=""
#CMD = "cmdline | getline myvar"
#print "" > "iri_fortran_output_grid.txt"



for (j = -9 ; j <= -9; j+=2){

    for (i = -2; i <= 2; i++){

        pipe= "\"" j "," i ",0.300\n2017,823,0,12.750\n20200" "\""

        #pipe= "\"49,12,0.300\n2017,823,1,12.750\n20200 \""
        #pipe= "\"49,12,0.300\n2017,823,1,12.750\n20200\""

        if (is_windows)
            cmdline = "echo -e " pipe " | ./iri_win.exe"
        else
            cmdline = "echo -e " pipe " | ./iri_unix.exe"

        print cmdline


        if ( (cmdline | getline myvar) > 0 ) {

            #close(cmdline | getline myvar)
            print "latitude " j " , longitude " i " done, TEC: " myvar " ;" 

        }
        else{
            #close(cmdline | getline myvar)
            print "error in latitude " j " , longitude " i
        }

        close(cmdline)
        #close(getline)

        #cmdline | getline myvar
        #myvar = $0

        mystring = mystring  myvar " "

    }

    # print one line into result file
    sub(/[ \t]+$/, "", mystring)
    sub(/^[ \t]+/, "", mystring)
    print mystring > "iri_fortran_output_grid.txt"
    print "longitude " j " done"
    mystring=""

    fflush("iri_fortran_output_grid.txt")
    fflush(stdout)

    #close("iri_fortran_output_grid.txt")


}

}

Unix 操作系统中 awk 脚本的输出:

loren32@nautilus:~/iri_exe_analysis$gawk -f ./create_grid.awk

At line 107 of file iri_4_tec_al_2.for (unit = 5, file = 'stdin')
Fortran runtime error: Bad real number in item 1 of list input
error in latitude -9 , longitude 0
echo -e "-9,1,0.300
2017,823,0,12.750
20200" | ./iri_unix.exe
...

Unix OS 中的输出仅执行外部 exe:

loren32@nautilus:~/iri_exe_analysis$ echo -e "-9,1,0.300\n2017,823,1,12.750\n20200" | ./iri_unix.exe
18.452

当我通过echo -e "stringcontent" 将字符串从 Unix 中的 bash 传送到 iri_unix.exe 时可以看出,它可以工作,但是来自 awk 脚本中的调用失败。

我怀疑引号在 unix 中的工作方式不同,并且以某种方式将额外的令人不安的字符串数据发送到 iri_unix.exe - 因此出现错误消息“列表输入的第 1 项中的实数错误”。

我想知道出了什么问题以及如何更正我的 awk 脚本以使其在 Unix 操作系统中工作。在 Windows 中,脚本运行良好

【问题讨论】:

  • 双引号将扩展外壳级别的内容,因此请尝试在 unix 中使用单引号。在 windows 和 unix 中都使用 \n 是否正常,因为 windows 通常使用 CR + LF(2 个字符),而 unix 只有 LF
  • 我建议在将代码发布到此处之前正确清理和缩进代码。 SO不是一个pastebin
  • hek2mgl 如果你能对此事做出贡献,而不是写一篇关于如何呈现代码的离题建议,我将非常感激。只是证明我的观点是正确的,这里有太多的 Blockwärte

标签: bash shell unix awk pipe


【解决方案1】:

解决方法是写

  echo "..."

在 Unix 环境中并省略 -e 选项。这对我来说是绝招。

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2014-01-22
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多