gawk脚本中无休止的递归

时间:2014-09-25 12:19:32

标签: awk gawk abas

请提前原谅我发布问题的这么大一部分,但我不能把手指放在失败的部分......

我有这样的输入文件(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

1 个答案:

答案 0 :(得分:1)

idk它是你唯一的问题,但是你错误地调用了getline,因此在某些情况下会进入无限循环。确保您完全理解http://awk.info/?tip/getline处的所有警告,并且您可能希望使用递归示例作为代码的起点。

最初为您的代码最重要的项目是,当getline失败时,它可以返回一个负值,因此while(getline f < infile)将创建一个无限循环,因为失败的getline将始终返回非零并将继续被召唤并继续失败。您需要改为使用while ( (getline f < infile) > 0)