ENDでは配列が空です。

ENDでは配列が空です。

単純なクロスソルバーを作成しようとしていますが、データの読み取りを完了することもできません。入力はlegendとmainという2つのファイルです。凡例に基づいて(動作する)単語を含む単純な配列を作成しました。ただし、パズル自体から文字の2D配列を作成しようとすると、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]
         }
      }
   }
}

編集:マトリックスリーダーの作成自体はうまく機能しますが、あるコードで別のリーダーと一緒に使用すると機能しません。コードを1行ずつ印刷することが有効なので動作します。配列はEND部分でのみ空で、なぜそうなのか理解できません。どのように干渉していますか? 「凡例」を最初に読みますが、配列は最後に変更されずにそのまま残ります。 「main」が2番目に来て、正しく読み書きされてから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]

ただし、ソートと追加情報の出力が見逃されます。

関連情報