Mawk에서 다차원 배열 걷기

Mawk에서 다차원 배열 걷기

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는 다차원 배열이 어떻게 작동해야 하는지에 대해 다른 생각을 갖고 있는 것 같습니다. Debian에서 mawk를 사용하여 실행할 때 구문 오류가 발생합니다. 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 문을 사용하여 첫 번째 차원을 선택할 수 있도록 전체 배열을 반복해 보았습니다(매우 비효율적이고 끔찍합니다)... 하지만 그렇게 할 수도 없습니다! :

$ 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)가 약간 오해의 소지가 있지만 진정한 다차원 배열 입니다. 소개 바로 다음에 "if ((i,j) in array)in 구문을 for 루프에서 사용하여 배열의 모든 요소를 ​​반복할 수도 있습니다." (v4.1.1부터 수정되었습니다!).

그러나 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/및 일부 문자열 분할을 사용하여 in합계 목록을 재구성하거나(존재 여부 테스트, 필요 없음)ijif ((i,j) in A)자동 활성화색인).

gawkarr이 진정한 다차원 배열인 루프를 사용할 수 없는 경우 위와 같이 (i,j) in arr이를 두 개(또는 원하는 만큼의 차원) 루프로 분할해야 합니다 . for하지만 완전히 정확하려면 내부 루프에 조건문이 포함되어야 합니다 . 왜냐하면 모든 요소가 차례로 배열일 isarray()필요는 없고 gawk에서는 기꺼이 스칼라도 허용하기 때문입니다.arr[i]

제가 아는 한은 mawk제외하고매뉴얼 페이지, 이는 표준의 새로운 awk(ish ) 구현을 목표로 합니다(따라서 실제 다차원 배열도 없고 인덱스 정렬도 없습니다 ).nawkisarray()

관련 정보