END에서 배열이 비어 있습니다.

END에서 배열이 비어 있습니다.

간단한 교차 솔버를 만들려고 하는데 데이터 읽기를 완료할 수도 없습니다. 입력은 legend와 main이라는 두 개의 파일입니다. 범례를 기반으로 (작동하는) 단어가 포함된 간단한 배열을 만들었습니다. 그러나 퍼즐 자체에서 문자의 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]
         }
      }
   }
}

편집: 매트릭스 리더를 생성하는 것 자체는 잘 작동하지만 한 코드에서 다른 리더와 함께 사용하면 작동하지 않습니다. 코드를 한 줄씩 인쇄하는 것이 유효하기 때문에 작동합니다. 배열은 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]

그러나 정렬 및 추가 정보 출력을 놓치게 됩니다.

관련 정보