Arrays in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Arrays in awk
# 1  
Old 07-28-2008
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[NR]=a[NR]$0" "}
else { if ((NR >= (5)) && (NR <= (13))) {
b[NR%3]=b[NR%3]$0" " }
else {if ((NR >= (14)) && (NR <= (25))){
c[NR%3]=c[NR%3]$0" "}
else{if ((NR>=(26)) && (NR<=(40))){
d[NR%3]=d[NR%3]$0" "}
}}}}
END {{for (i in a)
{print a[i]} }
{for (i in b)
{ print b[i]} }
{for (i in c)
{print c[i]} }
{for (i in d)
{print d[i]} }}

However, I want to apply this sorting to every set of 40 lines in the data file, where the data files are 10000+ lines. I tried enclosing the entire code in a for loop but this didn't work as the a, b, c and d arrays in each block of 40 lines would have to change as well.

Can arrays be given numerical names so they could be incremented with each execution of the for loop?

Many thanks Smilie
# 2  
Old 07-28-2008
Why not pass 40 lines at a time to the awk script..
# 3  
Old 07-28-2008
Do you mean by echo-ing/printing the selected line range, feeding that into the above program and then appending the output to another file?

Cheers Smilie
# 4  
Old 07-28-2008
Try this solution:

Code:
#!/bin/awk -f
function printem() {
        for (i in a) { print a[i] ; delete a[i] }
        for (i in b) { print b[i] ; delete b[i] }
        for (i in c) { print c[i] ; delete c[i] }
        for (i in d) { print d[i] ; delete d[i] }
}
{
        # use nr as the record number within this set of 40
        nr=NR%40

        if      (nr>=1  && nr<=4           ) a[nr  ]=a[nr  ]$0" "
        else if (nr>=5  && nr<=13          ) b[nr%3]=b[nr%3]$0" "
        else if (nr>=14 && nr<=25          ) c[nr%3]=c[nr%3]$0" "
        else if (nr==0  || nr>=26 && nr<=40) d[nr%3]=d[nr%3]$0" "

        if (nr==0) { printem() }
}
END { printem() }

I've changed the code layout a little to hopefully make it a bit more readable. It gets around your problem by deleting the contents of the arrays while printing them so that they are empty for the next set of 40 records.
# 5  
Old 07-28-2008
Thanks for that it's worked a treat!! Just one question... does:

nr=NR%40

just dictate that the first set of 40 lines should be processed first, and subsequent sets after?
# 6  
Old 07-28-2008
No, all it does is assigns the modulus of NR divided by 40 to a new variable, to save having to type NR%40 instead of nr in the rest of the code.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk Arrays

So I'm back once again beating my head off a wall trying to figure out how to get this to work. My end goal is to take input such as what's below, which will be capture in real time with a tail -f from a file or piped output from another command: ... (5 Replies)
Discussion started by: ShadowBlade72
5 Replies

2. 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

3. 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

4. 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

5. 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

6. 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

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