
我能夠在 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工作的人)真正的多維數組,儘管手冊頁(恕我直言)有點誤導:在介紹(自 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
/和一些字串分割來重建和in
的列表,或者(測試是否存在,無需i
j
if ((i,j) in A)
自動活化的索引)。
如果gawk
您無法使用(i,j) in arr
其中 arr 是真正的多維數組,則需要將其分成兩個(或任意多個維度)for
循環,如上所述。不過,為了完全正確,內部循環應該包含一個isarray()
條件,因為不需要每個元素arr[i]
依序都是數組,gawk 也很樂意允許標量。
據我所知,mawk
除了手冊頁,它的目標是成為一個標準的新awk
(即nawk
)實現(因此沒有真正的多維數組,沒有索引排序,也沒有isarray()
)。