У меня есть следующий 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 скрипт отлично работает