在 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 開始,thx工作的人)真正的多維數組,儘管手冊頁(恕我直言)有點誤導:在介紹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)自動活化的索引)。

如果gawk您無法使用(i,j) in arr其中 arr 是真正的多維數組,則需要將其分成兩個(或任意多個維度)for循環,如上所述。不過,為了完全正確,內部循環應該包含一個isarray()條件,因為不需要每個元素arr[i]依序都是數組,gawk 也很樂意允許標量。

據我所知,mawk除了手冊頁,它的目標是成為一個標準的新awk(即nawk)實現(因此沒有真正的多維數組,沒有索引排序,也沒有isarray())。

相關內容