Arrays in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Arrays in awk
# 1  
Old 01-14-2014
Arrays in awk

Array A contains lines of numbers from files. Array B contains number of fields for each line of each file.
I want to run on array A. To do that I need to know the number of fields for each file in array A (because each line doesn't have the same NF).
The NF is in array B, problem is: I don't know how to run on each element for each file in array B.
I only need to change this loop
for (i=1; i<=length(B[ARGV[f],f]); i++)
Would appreciate your help!


Code:
#!/bin/awk -f
{
        for (i=1; i<= NF; i++)
                {A[FILENAME,FNR,i]=$i}
        B[FILENAME,FNR]=NF
}

END {
        for (f=1; f<length(ARGV); f++) {
                for (i=1; i<=length(B[ARGV[f],f]); i++) {       //here is the problem
                        print i
                        }
                }

}

# 2  
Old 01-14-2014
awk arrays don't really work that way. awk arrays really aren't arrays at all -- a "2d array" is really just a 1d array with both indexes squashed together as a string.

So you certainly can't get that information from the array itself. You'll have to store it somewhere else.

You can get the pairs out of that array though:

Code:
for(Y in B) {
        split(Y, SUBSEP, ARR);
        // ARR[0] is now FILENAME, ARR[1] is now FNR
}

SUBSEP is the character array indexes are joined together on by default, i.e A[X,Y] becomes A[X SUBSEP Y]. It's some some odd nonprinting ASCII character.

Last edited by Corona688; 01-14-2014 at 04:39 PM..
These 2 Users Gave Thanks to Corona688 For This Post:
# 3  
Old 01-14-2014
There is lots of redundant information stored in memory, e.g FILENAME is stored very often.
I would go for the following, and adapt the END section accordingly:
Code:
{
 for (i=1; i<=NF; i++) A[NR,i]=$i
 B[NR]=NF
}
FNR==1 {
 fc++
 fn[fc]=FILENAME
 start[fc]=NR
}
END {
 for (f=1; f<=fc; f++) {
  print fn[f],start[f]
  stop=((f+1) in start) ? start[f+1] : NR+1
  for (line=start[f]; line<stop; line++) {
   print B[line]
  }
 }
}


Last edited by MadeInGermany; 01-15-2014 at 06:11 AM.. Reason: fix: NR+1. And start[fc] is simply NR.
These 2 Users Gave Thanks to MadeInGermany For This Post:
# 4  
Old 01-15-2014
When the pattern is FNR==1, wouldn't NR-FNR+1equal NR?
This User Gave Thanks to RudiC For This Post:
# 5  
Old 01-15-2014
So true! Updated.
# 6  
Old 01-15-2014
MadeInGermany- This is the output I get:
Code:
file1 1
3
3
3
file2 4
3
3
3

Could you explain to me what it means? I don't see how it has anything to do woth what I asked.
# 7  
Old 01-15-2014
As MadeInGermany said: "adapt the END section accordingly". You shouldn't print B[line] but loop through the A array and print each of its elements.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Using arrays with awk

I'm a little stuck and would be grateful of some advice! I have three files, two of which contain reference data that I want to add to a line of output in the third file. I can't seem to get awk to print array contents as I would expect. The input files are: # Input file AAA,OAA,0313... (2 Replies)
Discussion started by: maccas17
2 Replies

2. Shell Programming and Scripting

help in awk arrays!

Hi, buddies I am new to shell scripting and trying to solve a problem. I read about arrays in awk that they are quite powerful and are associative in nature. Awk Gurus Please help! I have a file: Id1 pp1 0t4 pp8 xy2 Id43 009y black Id6 red xy2 Id12 new pp1 black I have... (5 Replies)
Discussion started by: geli21
5 Replies

3. UNIX for Dummies Questions & Answers

awk arrays

Hi Can someone please explain the logic of awk arrays. I have been doing some reading but I dont understand this: #!/usr/bin/gawk -f { arr++; } end { for(i in arr) { print arr,i } } As I understand arr refs the arrays index, so while $2 is a string that cant... (2 Replies)
Discussion started by: chronics
2 Replies

4. Shell Programming and Scripting

arrays in awk

Hi, I have the following data in a file for example: Name="Fred","Bob","Peterson","Susan","Weseley" Age="24","30","28","23","45" Study="English","Engineering","Physics","Maths","Psychology" Code="0","0","1","1","0" Name="Fred2","Bob2","Peterson2","Susan2","Weseley2"... (14 Replies)
Discussion started by: james2009
14 Replies

5. Shell Programming and Scripting

awk arrays can do this better - but how?

Hi, I have spent the afternoon trawling Google, Unix.com and Unix in a Nutshell for information on how awk arrays work, and I'm not really getting too far. I ahve a batch of code that I am pretty sure can be better managed using awk, but I'm not sure how to use awk arrays to do what I'm... (1 Reply)
Discussion started by: littleIdiot
1 Replies

6. Shell Programming and Scripting

Arrays in awk

Hi, I've written the following code to manipulate the first 40 lines of a data file into my desired order: #!/bin/awk -f { if (NR<=(4)){ a=a$0" "} else { if ((NR >= (5)) && (NR <= (13))) { b=b$0" " } else {if ((NR >= (14)) && (NR <= (25))){ c=c$0" "} ... (5 Replies)
Discussion started by: catwoman
5 Replies

7. Shell Programming and Scripting

Need Help with awk and arrays

now its owkring - thanks fo rthe help all . (7 Replies)
Discussion started by: fusionX
7 Replies

8. Shell Programming and Scripting

awk arrays

Guys, OK so i have been trying figure this all all day, i guess its a pretty easy way to do it. Right, so i have to column of data which i have gotten from one huge piece of data. What i would like to do is to put both of these into one array using awk. Is this possible?? If so could... (1 Reply)
Discussion started by: imonthejazz
1 Replies

9. Shell Programming and Scripting

arrays in awk???

Been struggling with a problem, I have been trying to do this in awk, but am unable to figure this out, I think arrays have to be used, but unsure how to accomplish this. I have a input file that looks like this: 141;ny;y;g 789;ct;e;e 23;ny;n;u 45;nj;e;u 216;ny;y;u 7;ny;e;e 1456;ny;e;g... (3 Replies)
Discussion started by: craigsky
3 Replies

10. UNIX for Advanced & Expert Users

Two or more arrays in Awk

Hi All, I have been working on awk and arrays. I have this small script: cat maillog*|awk -F: '$2=="SMTP-Accept" && $5~/string/ {lastdate=substr($1,1,8); internaluser=$5; v++} END {for (j in v) {print lastdate, v, j}'| sort>> mail.list This gives me the number of mails users are getting. ... (1 Reply)
Discussion started by: nitin
1 Replies
Login or Register to Ask a Question