gawk - How to loop through multidimensional array?

I have an awk script that I am writing and I needed to make use of a multidimensional array to hold some data... Which is all fine but I need to loop through that array now and I have no idea how to do that.

for a regular array, the following works:

ARRAY[NUMBER]
for(var in ARRAY) {
  ...
}

but I get syntax errors if I try the following:

ARRAY[WORD][NUMBER]
for(var in ARRAY[1]) {
  ...
}

syntax error at or near [

How can I loop through a multidimensional array?

---------- Post updated at 09:37 AM ---------- Previous update was at 09:31 AM ----------

Upon further thinking I just created a new variable to mark how many elements were in the second index in the array. If there is a way to loop through the array without having to do that I would like to know.

Thanks,

Do you mean something like this?

awk 'BEGIN {
  for (x = 0; ++x <= 10;) 
    for (y = 0; ++y <= 5;)
      aOa[x][y] = "element:" FS x FS y
    
  for (i in aOa)
    for (j in aOa)
      print aOa[j]
  }'
% awk 'BEGIN {
  for (x = 0; ++x <= 10;)
    for (y = 0; ++y <= 5;)
  aOa[x][y] = "element:" FS x FS y

  for (i in aOa)
    for (j in aOa)
      print aOa[j]
  }'
element: 4 4
element: 4 5
element: 4 1
element: 4 2
element: 4 3
element: 5 4
element: 5 5
element: 5 1
element: 5 2
element: 5 3
element: 6 4
element: 6 5
element: 6 1
element: 6 2
element: 6 3
element: 7 4
element: 7 5
element: 7 1
element: 7 2
element: 7 3
element: 8 4
element: 8 5
element: 8 1
element: 8 2
element: 8 3
element: 9 4
element: 9 5
element: 9 1
element: 9 2
element: 9 3
element: 10 4
element: 10 5
element: 10 1
element: 10 2
element: 10 3
element: 1 4
element: 1 5
element: 1 1
element: 1 2
element: 1 3
element: 2 4
element: 2 5
element: 2 1
element: 2 2
element: 2 3
element: 3 4
element: 3 5
element: 3 1
element: 3 2
element: 3 3

This is with GNU awk 4.

That is exactly what I am looking for but I get a syntax error when in including brackets...

OS: ubuntu 11.10 - gawk version 3.1.7 :confused:

$ awk 'BEGIN {
>   for (x = 0; ++x <= 10;)
>     for (y = 0; ++y <= 5;)
>   aOa[x][y] = "element:" FS x FS y
> 
>   for (i in aOa)
>     for (j in aOa)
>       print aOa[j]
>   }'
awk: cmd. line:3:   aOa[x][y] = "element:" FS x FS y
awk: cmd. line:3:         ^ syntax error
awk: cmd. line:6:     for (j in aOa)
awk: cmd. line:6:                  ^ syntax error
awk: cmd. line:7:       print aOa[j]
awk: cmd. line:7:                   ^ syntax error

$ which awk
/usr/bin/awk

$ ls -l /usr/bin/awk 
lrwxrwxrwx 1 root root 21 2011-10-03 10:07 /usr/bin/awk -> /etc/alternatives/awk

$ ls -l /etc/alternatives/awk
lrwxrwxrwx 1 root root 13 2011-10-03 10:07 /etc/alternatives/awk -> /usr/bin/gawk

$ gawk --version
GNU Awk 3.1.7

fwiw, here is the awk script... that I had to do some silly hacks to make it work correctly due to the odd syntax errors...

{ if($0~"My.*Ver") 
  { #We have the line with mysql version,  
    split($0,VER,"=")
    sqlver=VER[2]
  } else 
  { if($0~" Databases:") 
    { #Database information starts here.
      next
    } else 
    { if($0~"DB:=") 
      { #Number of DB's
        DBCNT++
        split($0,NAME,"=")
        #DB Names
        DBNAME[DBCNT]=NAME[2]
        i=0
      } else if($0~"SIZE") 
      { SIZE[DBCNT]=$0
      } else 
      { i++
        table[DBCNT, i]=$0
        TABLES[DBCNT]=i
      }
    }
  }
} END {
  #loop
  printf "MySQLVersion=%s,\n",sqlver
  for(var1 in DBNAME) {
    printf "DBNAME=%s %s,\n",DBNAME[var1],SIZE[var1]
    max=TABLES[var1]
    loop="true"
    cnt=1
    while(loop=="true") {
      printf "%s\n",table[var1, cnt]
      if(TABLES[var1] == cnt) {
        loop="false"
      } else {
        cnt++
      }
    }
  }
}

what's wrong with this?

awk '
BEGIN {
  for (x = 0; ++x <= 10;)
    for (y = 0; ++y <= 5;)
      aOa[x,y] = "element:" FS x FS y

  for (i in aOa)
      print aOa
  }'

Yes, as already stated, with your version you can simulate multidimensional arrays. If you need a somehow more granular access to the elements,
you can use something like this:

awk 'BEGIN {
  for (x = 0; ++x <= 10;) 
    for (y = 0; ++y <= 5;) 
      aOa[x, y] = "element:" FS x FS y
      
  for (i in aOa) {
    split(i, t, SUBSEP)
      print aOa[t[1], t[2]]
    }
  }'  

Otherwise, you can download and install GNU awk 4.

Thanks for the help! I appreciate it... that was driving me nuts.