数组在 END 中不知何故为空

数组在 END 中不知何故为空

我正在尝试创建一个简单的十字交叉求解器,但我什至无法完成数据的读取。输入是两个文件,legend 和 main。根据图例,我创建了一个带有单词的简单数组(有效)。然而,当我尝试从拼图本身创建一个二维字母数组时,我最终在 END 部分得到空数组。

{
   if(FILENAME=="legend") {
      l[NR]=$1
   }

   else{
      mw=NF
      for(i=1;i<=NF;i++)
         m[i,NR]=$i
      mh++

      for(i=1;i<=NF;i++)
         printf "%s ", m[i,NR]
   }
}

END{
   print "LEGEND:"
   for(i=1;i<length(l);i++)
      print l[i]

   print "MAIN:"
   for(h=1;h<=mh;h++){
      print "For line ",h
      for(w=1;w<=mw;w++){
         print "For element ",w
         if(m[w,h]!=""){
            print m[w,h]
         }
      }
   }
}

编辑:仅创建矩阵读取器本身可以正常工作,但是在一个代码中与其他读取器一起使用时,它无法正常工作。它确实有效,因为逐行打印代码是有效的。数组仅在 END 部分为空,我就是无法理解为什么......它们是否以某种方式干扰?首先读取“图例”,但数组在末尾保持不变。 “main”排在第二位,被正确读取和写入,然后在 END 中消失。你知道为什么吗?

答案1

当您将数据放入 时,您可以将NR其用作索引m

m[i,NR]=$i

读取legend文件后,NR不重置,这意味着索引不从 开始1,1。您可能想改用FNRmh + 1

我没有查看其余的代码。


一些改进建议:

我不知道你的数据是什么样的,所以我一直在猜测。 NF并且FNR没有受到影响最后一行输入END块中,因此只要最后一个文件的最后一行正确且完全指定,这应该可以工作。这摆脱了mhmw变量。

循环简单数组的简单方法是使用for (i in arr).这i依次设置数组中的每个索引。但请注意,索引很可能“无序”地呈现给循环。

第一个块读取legend文件。这意味着这不得不是命令行上的第一个文件操作数。

NR == FNR { l[FNR] = $1; next }

{
    for (i = 1; i <= NF; i++) {
        m[i,FNR] = $i
    }
    print
}

END {
    print "LEGEND:"
    for (i in l) print l[i]

    print "MAIN:"
    for (h = 1; h <= FNR; h++) {
        printf("For line %d\n", h)
        for (w = 1; w <= NF; w++) {
            printf("For element %d\n", w)
            if (m[w,h]) print m[w,h]
        }
    }
}

对于最后一个双循环,你也可以这样做

for (i in m) print i, m[i]

但您错过了排序和额外的信息输出。

相关内容