간단한 교차 솔버를 만들려고 하는데 데이터 읽기를 완료할 수도 없습니다. 입력은 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]
그러나 정렬 및 추가 정보 출력을 놓치게 됩니다.