我正在尝试创建一个简单的十字交叉求解器,但我什至无法完成数据的读取。输入是两个文件,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
。您可能想改用FNR
或mh + 1
。
我没有查看其余的代码。
一些改进建议:
我不知道你的数据是什么样的,所以我一直在猜测。 NF
并且FNR
没有受到影响最后一行输入在END
块中,因此只要最后一个文件的最后一行正确且完全指定,这应该可以工作。这摆脱了mh
和mw
变量。
循环简单数组的简单方法是使用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]
但您错过了排序和额外的信息输出。