请提前原谅我发布问题的这么大一部分,但我不能把手指放在失败的部分......
我有这样的输入文件(abas-FO,如果你想知道的话):
.fo U|xiininputfile = whatever
.type text U|xigibsgarnich
.assign U|xigibsgarnich
..
..Comment
.copy U|xigibswohl = Spaß
.ein "ow1/UWEDEFTEST.FOP"
.in "ow1/UWEINPUT2"
.continue BOTTOM
.read "SOemthing" U|xttmp
!BOTTOM
..
..
现在我想按照每个.in [put] / .ein [gabe] -statement递归,解析上面提到的文件,如果我还不知道,请将它添加到数组中。我的代码如下所示:
#!/bin/awk -f
function getFopMap(inputregex, infile, mandantdir, infiles){
while(getline f < infile){
#printf "*"
#don't match if there is a '
if(f ~ inputregex "[^']"){
#remove .input-part
sub(inputregex, "", f)
#trim right
sub(/[[:blank:]]+$/, "", f)
#remove leading and trailing "
gsub(/(^\"|\"$)/,"" ,f)
if(!(f in infiles)){
infiles[f] = "found"
}
}
}
close(infile)
for (i in infiles){
if(infiles[i] == "found"){
infiles[i] = "parsed"
cmd = "test -f \"" i "\""
if(system(cmd) == 0){
close(cmd)
getFopMap(inputregex, f, mandantdir, infiles)
}
}
}
}
BEGIN{
#Matches something like [.input myfile] or [.ein "ow1/myfile"]
inputregex = "^\\.(in|ein)[^[:blank:]]*[[:blank:]]+"
#Get absolute path of infile
cmd = "python -c 'import os;print os.path.abspath(\"" ARGV[1] "\")'"
cmd | getline rootfile
close(cmd)
infiles[rootfile] = "parsed"
getFopMap(inputregex, rootfile, mandantdir, infiles)
#output result
for(infile in infiles) print infile
exit
}
我调用脚本(在路径相对的同一目录中),如下所示:
./ script ow1 / UWEDEFTEST.FOP
我没有输出。它只是挂断了。如果我在printf&#34; *&#34;之前删除评论。命令,我看到了星星,没有结束。
我感谢每一个帮助,并提示如何做得更好。
我的问题: gawk版本3.1.7
答案 0 :(得分:1)
idk它是你唯一的问题,但是你错误地调用了getline,因此在某些情况下会进入无限循环。确保您完全理解http://awk.info/?tip/getline处的所有警告,并且您可能希望使用递归示例作为代码的起点。
最初为您的代码最重要的项目是,当getline失败时,它可以返回一个负值,因此while(getline f < infile)
将创建一个无限循环,因为失败的getline将始终返回非零并将继续被召唤并继续失败。您需要改为使用while ( (getline f < infile) > 0)
。