gawk脚本中的无限递归
请原谅我提前发布了这么大一部分我的问题,但我就是不能把我的手指放在失败的部分 我得到了如下输入文件(如果您想知道,请使用abas FO): 现在,我想递归地跟踪每个.in[put]/.ein[gabe]-语句,解析所提到的文件,如果我还不知道,则将其添加到数组中。我的代码如下所示: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)
#!/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我知道。但这必须在非常旧的客户服务器上工作,作为一名学徒,我无法请求更新…我在我的答案中为您添加了第一步。我只是偶然发现了这个…很抱歉打扰您。祝您愉快。