
나는 gawk에서 이것을 제대로 할 수 있지만, 그것이 실행될 컴퓨터에 내 코드를 게시하려고 시도했을 때 그것이 mawk를 사용하고 있다는 것을 깨달았습니다...
$ cat multidim.gawk
# test of multidimensional arrays
// {
A[1][1]="A11"
A[1][2]="A12"
A[2][1]="A21"
A[2][2]="A22"
i=2
for ( j in A[i] )
{
print "i=" i " j=" j " A[i][j]=" A[i][j]
}
}
$ echo hi | awk -f multidim.gawk
i=2 j=1 A[i][j]=A21
i=2 j=2 A[i][j]=A22
mawk는 다차원 배열이 어떻게 작동해야 하는지에 대해 다른 생각을 갖고 있는 것 같습니다. mawk를 사용하여 Debian에서 실행하면 구문 오류가 발생합니다. A[i,j]는 올바른 구문으로 보이며 다차원 배열을 '합성'합니다.
그래서 나는 두 가지를 시도했지만 둘 다 작동하지 않았습니다.
$ cat multidim.mawk
// {
A[1,1]="A11"
A[1,2]="A12"
A[2,1]="A21"
A[2,2]="A22"
i=2
for ( j in A[i] )
{
print "i=" i " j=" j "a[i,j]=" a[i,j]
}
}
$ echo hi | awk -f multidim.mawk
awk: multidim.mawk: line 9: syntax error at or near [
합리적인 것 같습니다. "다차원" 배열에 1dim 배열 인덱스를 사용하면 오류가 발생합니다.
if 문을 사용하여 첫 번째 차원을 선택할 수 있도록 WHOLE 배열을 탐색하려고 합니다(매우 비효율적이고 끔찍합니다)... 하지만 그렇게 할 수도 없습니다!:
$ cat multidim2.mawk
# test of multidimensional arrays
// {
A[1,1]="A11"
A[1,2]="A12"
A[2,1]="A21"
A[2,2]="A22"
for ( (i, j) in A )
{
print "i=" i " j=" j "a[i,j]=" a[i,j]
}
}
$ echo hi | awk -f multidim2.mawk
awk: multidim2.mawk: line 8: syntax error at or near )
mawk에서 다차원 배열을 탐색할 수 있는 방법이 있나요?
mawk 맨페이지 이외의 언어 참조가 있습니까?
감사해요!
답변1
mawk
(및 nawk
)만 제공합성된 다차원 배열.
gawk
제공합니다(4.0부터일하는 남자) 실제 다차원 배열 이지만 매뉴얼 페이지(IMHO)가 약간 잘못 지시되어 있지만 소개 직후에는 (v4.1.1부터 수정되었습니다!).if ((i,j) in array)
"in 구문은 for 루프에서 배열의 모든 요소를 반복하는 데 사용될 수도 있습니다."
그러나 for ((i,j) in array)
이것들을 반복하는 방법은 아닙니다. 방법 gawk
은 (원래 사용한대로) 다음과 같습니다.
for (i in array)
for (j in array[i])
print array[i][j]
~ 와 함께 nawk
/ mawk
당신은 붙어 있습니다합성된 다차원 배열, 그래서
for (ij in A) {
split(ij,xx,SUBSEP);
printf("A[%s,%s]=%s\n",xx[1],xx[2],A[ij])
}
이제 다음 문제는주문, 배열 인덱스는 암시적으로 문자열 유형이고 배열은 암시적으로 정렬되지 않습니다. 0..N의 연속적인 정수 인덱스가 있는 단순 비희소 배열의 경우와 같이 인덱스에 대한 별도의 지식이 없는 경우. gawk
제안주문에 대한 해결책in
.
합성된 배열의 인덱스를 알고 있는 경우 A[i,j]
(로 처리됨 A[i SUBSEP j]
) 또는 for
/ 및 일부 문자열 분할을 사용하여 and in
목록을 다시 작성 하거나 (존재 여부 테스트, 없이i
j
if ((i,j) in A)
자가생화인덱스).
arr이 진정한 다차원 배열인 경우 사용할 수 없으므로 위와 같이 2개(또는 많은 차원) 루프로 나누어야 gawk
합니다 . 하지만 완전히 정확하려면 내부 루프에 조건이 포함되어야 합니다 . 모든 요소가 배열일 필요는 없으므로 gawk는 스칼라도 허용합니다.(i,j) in arr
for
isarray()
arr[i]
mawk
외에는 구체적인 문서가 없는 것으로 알고 있습니다 .맨 페이지, 이는 표준적인 새로운 awk
(예: nawk
) 구현을 목표로 합니다(따라서 진정한 다차원 배열도 없고 인덱스 정렬도 없으며 isarray()
).