awk - передача строки во внешний исполняемый файл gfortran в unix - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий awk-скрипт «create_grid.awk», который передает команду через внешний exe-файл (iri_win.exe / iri_unix.exe, созданный с помощью gfortran) и считывает ответ через 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")


}

}

Вывод скрипта awk в ОС Unix:

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 только при выполнении внешнего 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" iri_unix.exe из bash в Unix, она работает, но вызов из скрипта awk завершается неудачно.

Я подозреваю, что кавычки работают по-разному в Unix, и каким-то образом дополнительные тревожные строковые данные отправляются в iri_unix.exe - отсюда сообщение об ошибке «Неверное действительное число в элементе 1 ввода списка».

Интересно, что не так и как исправить мой awk-скрипт, чтобы он работал в Unix OS. В Windows скрипт отлично работает

1 Ответ

0 голосов
/ 10 мая 2018

Обходной путь должен написать

  echo "..."

в среде Unix и не указывайте параметр -e. Это уловка для меня.

...