gawk - How to loop through multidimensional array?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting gawk - How to loop through multidimensional array?
# 1  
Old 10-03-2011
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:

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

but I get syntax errors if I try the following:

Code:
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,
# 2  
Old 10-03-2011
Do you mean something like this?

Code:
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[i])
      print aOa[i][j]
  }'

Code:
% 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[i])
      print aOa[i][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.

Last edited by radoulov; 10-03-2011 at 05:23 PM.. Reason: New example.
# 3  
Old 10-03-2011
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 Smilie

Code:
$ 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[i])
>       print aOa[i][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[i])
awk: cmd. line:6:                  ^ syntax error
awk: cmd. line:7:       print aOa[i][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...

Code:
{ 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++
      }
    }
  }
}

# 4  
Old 10-03-2011
what's wrong with this?
Code:
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[i]
  }'

# 5  
Old 10-03-2011
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:

Code:
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.
# 6  
Old 10-03-2011
Quote:
Originally Posted by radoulov
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:

Code:
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.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Sort multidimensional Array

Hello I have a problem. I create a Multidimensional Array Like this: ENTRY="$kunnum-$host" ENTRY="$host" ENTRY="# $3" for key in "${!ENTRY}"; do ENTRIES=${ENTRY} # INDEX=IP(5) donedeclare -p declare -A ENTRIES=(="unas15533" ="unas" ="# RDP-Terminal 2"... (12 Replies)
Discussion started by: Marti95
12 Replies

2. Shell Programming and Scripting

Multidimensional array

I am learning about bash system variables, such as $ , @ and #. I have this piece of script implementing an array and it is doing its job just fine. This is not the only array I will be using. Just for ease of maintenance and more coding I would like to have the arrays in two dimensional... (4 Replies)
Discussion started by: annacreek
4 Replies

3. Shell Programming and Scripting

Multidimensional array:awk error

awk -F'\t' -v OFS='\t' ' { if($2 in arr) { #print "Sahi", NR,arr for(k=2;k<=NF;k++){ # sum]+=$2 } } else { arr=NR #print "awk",NR for (k=3;k<=NF ; k++){ sum=$k } } } (7 Replies)
Discussion started by: genome
7 Replies

4. Shell Programming and Scripting

Help with gawk array, loop in tcsh script

Hi, I'm trying to break a large csv file into smaller files and use unique values for the file names. The shell script i'm using is tcsh and i'm after a gawk one-liner to get the desired outcome. To keep things simple I have the following example with the desired output. fruitlist.csv apples... (6 Replies)
Discussion started by: theflamingmoe
6 Replies

5. Shell Programming and Scripting

multidimensional array in awk

Hi, I was trying to process a file with the help of awk. I want to first display all the rows that contains 01 and at the end of processing I have to print some portion of all the lines. like below. Output expected: (2 Replies)
Discussion started by: ahmedwaseem2000
2 Replies

6. Programming

multidimensional array using c++ vector

Hi! I need to make dynamic multidimensional arrays using the vector class. I found in this page How to dynamically create a two dimensional array? - Microsoft: Visual C++ FAQ - Tek-Tips the way to do it in 2D, and now i'm trying to expand it to 3D but i don't understand how is the operator working,... (0 Replies)
Discussion started by: carl.alv
0 Replies

7. Programming

C programming working with multidimensional array

Hi, I have the following variable declaration which looks like a 3d array or N matrixs KxK of floats float (*table); I have to pass to a function only the first table. How can I do it?? Thanks (6 Replies)
Discussion started by: littleboyblu
6 Replies

8. Shell Programming and Scripting

AWK multidimensional array

In a single dim. awk array, we can use : <index> in <array name> to determine whether a particualar index exists in the array or not. Is there a way to achieve this in a awk multi dim. array ? (4 Replies)
Discussion started by: sinpeak
4 Replies

9. Shell Programming and Scripting

Awk multidimensional Array

Hello Experts,, Can anybody give me a brief idea what is following bold letter statement is for!! what is the term called so that I can google for it.. It seems to be an array inside another array.. awk' /TXADDR/ { txaddr=$NF } ##understood /TXDATA/ { txdata]=$NF... (1 Reply)
Discussion started by: user_prady
1 Replies

10. Shell Programming and Scripting

multidimensional array in perl

i'm trying to open a file with three or more columns and an undetermined, but finite number of rows. I want to define an array for each row with each element of the row as a sub array. The columns are separated by tabs or spaces. Here's the file: 12x3.12z34b.342sd3.sds 454.23.23.232 ... (9 Replies)
Discussion started by: prkfriryce
9 Replies
Login or Register to Ask a Question