gawk脚本中的无限递归

gawk脚本中的无限递归,awk,gawk,abas,Awk,Gawk,Abas,请原谅我提前发布了这么大一部分我的问题,但我就是不能把我的手指放在失败的部分 我得到了如下输入文件(如果您想知道,请使用abas FO): 现在,我想递归地跟踪每个.in[put]/.ein[gabe]-语句,解析所提到的文件,如果我还不知道,则将其添加到数组中。我的代码如下所示: #!/bin/awk -f function getFopMap(inputregex, infile, mandantdir, infiles){ while(getline f < infile)

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

我得到了如下输入文件(如果您想知道,请使用abas FO):

现在,我想递归地跟踪每个.in[put]/.ein[gabe]-语句,解析所提到的文件,如果我还不知道,则将其添加到数组中。我的代码如下所示:

#!/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
}
#/垃圾箱/awk-f
函数getFopMap(inputregex、infle、mandantdir、infles){
while(getline f
我这样调用脚本(在路径相对的同一目录中):

#!/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“*”命令之前删除注释,我将看到星星,没有尽头

我感谢每一个帮助和提示如何做得更好

我的awk:
gawk 3.1.7版

idk这是您唯一的问题,但您调用getline的方式不正确,因此在某些情况下会进入无限循环。请确保您完全理解此处的所有注意事项,并且您可能希望使用递归示例作为代码的起点


对于您的代码来说,最重要的一点是,当getline失败时,它可以返回一个负值,因此
while(getline f
将创建一个无限循环,因为失败的getline将始终返回非零,因此将继续被调用并继续失败。您需要使用
while((getline f0)
取而代之。

您可以在
BEGIN
块中执行所有操作。这是一个非常旧的gawk版本,您确实应该升级到当前版本,因为您缺少很多非常有用的功能。@fedorqui我知道。在程序的后面,我必须递归地读取找到的文件,所以我看不到使用{}的理由功能,只处理一个文件。但可能我遗漏了一些重要的东西…@Ed Morton我知道。但这必须在非常旧的客户服务器上工作,作为一名学徒,我无法请求更新…我在我的答案中为您添加了第一步。我只是偶然发现了这个…很抱歉打扰您。祝您愉快。