awk - 将字符串管道连接到Unix中外部Gfortran构建的可执行文件



我有以下awk脚本"create_grid.awk",它将命令通过管道传输到外部exe(iri_win.exe/iri_unix.exe使用gfortran构建(,并通过getline(创建具有两个嵌套for循环的值网格(读回响应。虽然一切都像窗口中的魅力一样工作,但 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.300n2017,823,0,12.750n20200" """
#pipe= ""49,12,0.300n2017,823,1,12.750n20200 ""
#pipe= ""49,12,0.300n2017,823,1,12.750n20200""
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 OS中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 操作系统中的输出仅在执行外部 exe :

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

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

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

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

解决方法是编写

echo "..."

在 Unix 环境中,并省略 -e 选项。那对我来说是死的把戏。

最新更新