For Programmers: Free Programming Magazines  


Home > Archive > AWK > October 2004 > clearing the data array in awk









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author clearing the data array in awk
entropic

2004-10-09, 3:55 pm

Why doesn't the commented out expression work? I'm trying to avoid
having to use the repetitive version listed below.

# for ( i = 1; i <= 10; i++ ) {
# cap[i] = 0
# }

cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0

A non-programmer using MKS Toolkit's awk...

z.entropic
Chris F.A. Johnson

2004-10-09, 3:55 pm

On 2004-10-09, entropic wrote:
> Why doesn't the commented out expression work? I'm trying to avoid
> having to use the repetitive version listed below.
>
> # for ( i = 1; i <= 10; i++ ) {
> # cap[i] = 0
> # }


What makes you think this doesn't work? It works for me in old
awk, nawk and gawk.

> cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
>
> A non-programmer using MKS Toolkit's awk...


--
Chris F.A. Johnson http://cfaj.freeshell.org/shell
========================================
===========================
My code (if any) in this post is copyright 2004, Chris F.A. Johnson
and may be copied under the terms of the GNU General Public License
Ed Morton

2004-10-09, 3:55 pm



entropic wrote:

> Why doesn't the commented out expression work? I'm trying to avoid
> having to use the repetitive version listed below.
>
> # for ( i = 1; i <= 10; i++ ) {
> # cap[i] = 0
> # }
>
> cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
>
> A non-programmer using MKS Toolkit's awk...
>
> z.entropic


It doesn't work because you commented it out ;-). Otherwise, it'd do
exactly the same as your single-line version.

Ed.
Bob Harris

2004-10-10, 3:55 am

In article <fcb9e60c.0410090744.490e3780@posting.google.com>,
subPlanck@excite.com (entropic) wrote:

> Why doesn't the commented out expression work? I'm trying to avoid
> having to use the repetitive version listed below.
>
> # for ( i = 1; i <= 10; i++ ) {
> # cap[i] = 0
> # }
>
> cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
>
> A non-programmer using MKS Toolkit's awk...
>
> z.entropic


Looks good to me. Or did you want to delete the array elements?

for( j=1; j <= 10; j++ ) {
delete cap[j]
}

Then tests like

if ( 1 in cap ) print "first element in cap array exists"

would not print since you just deleted the cap[1] element of the array.
And

for( j in cap ) {
print j, cap[j]
}

would not find entries 1 through 10, as you just deleted them.

But if you just want to have cap 1 through 10 be zeros, then the for
loop you showed should work very well.

Bob Harris
entropic

2004-10-13, 3:55 pm

Ed Morton <morton@lsupcaemnt.com> wrote in message news:<x-WdnYOaruOkrfXcRVn-rg@comcast.com>...
> entropic wrote:
>
>
> It doesn't work because you commented it out ;-). Otherwise, it'd do
> exactly the same as your single-line version.
>
> Ed.


:-)

that would be too easy...

z.entropic
entropic

2004-10-13, 3:55 pm

Bob Harris <harris@zk3.dec.com> wrote in message news:<harris-AC7BBE.17425309102004@cacnews.cac.cpqcorp.net>...
> In article <fcb9e60c.0410090744.490e3780@posting.google.com>,
> subPlanck@excite.com (entropic) wrote:
>
>
> Looks good to me. Or did you want to delete the array elements?
>
> for( j=1; j <= 10; j++ ) {
> delete cap[j]
> }
>
> Then tests like
>
> if ( 1 in cap ) print "first element in cap array exists"
>
> would not print since you just deleted the cap[1] element of the array.
> And
>
> for( j in cap ) {
> print j, cap[j]
> }
>
> would not find entries 1 through 10, as you just deleted them.
>
> But if you just want to have cap 1 through 10 be zeros, then the for
> loop you showed should work very well.
>
> Bob Harris


Since the mystery persists, here's my program (some values, like n and
filenames, are passed on from the command line). The last loop, now
commented out, doesn't work, since no values are printed, but if the
tedious version is active, everything's OK. If I delete array
elements by delete cur[i], nothing is printed, either. I'm baffled...

z.entropic

========================================
======================
FNR == 1 { end_game() }
END { end_game() }
OFS = " "

( $10 == "C" || $10 == "D" ) && ( $11 == 133 || $11 == 132 ) {

cap[i] = $6
ene[i] = $7
cur[i] = $8
pot[i] = $9
UpDn[i] = $10
meth[i] = $11

if ( $6 > f6 ) {
f6 = $6
}

fn = FILENAME
i++

# print n values per file
if ( i > n ) {
next
}
k = i
}

function end_game() {
for ( i = 1; i <= k && f6 && cap[i] && cur[i] > 0; i++ ) {

printf "%s %3.3g %s %3.g %1.2f %1.3f %1.3e %1.3e %5.1f %5.1f %5.1f\n",
\
fn, i, UpDn[i], meth[i], pot[i], cap[i]*1000, ene[i]*1000, \
cur[i]/(cap[3]==0?1e+100:cap[3]), \
cap[i]/(cap[2]==0?1e+100:cap[2])*100, \
cap[i]/(cap[3]==0?1e+100:cap[3])*100, \
cap[i]/(cap[9]==0?1e+100:cap[9])*100

}
if ( f6 != "" ) {
print "\n"
}
fn = f6 = ""
i = k = 1

#for ( i = 1; i <= 30; i++ ) {
# cap[i]=0
# ene[i]=0
# cur[i]=0
# pot[i]=0
# UpDn[i]=0
# meth[i]=0
# }

cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
cap[11]=cap[12]=cap[13]=cap[14]=cap[15]=
cap[16]=cap[17]=cap[18]=cap[19]=cap[20]=
0
cap[21]=cap[22]=cap[23]=cap[24]=cap[25]=
cap[26]=cap[27]=cap[28]=cap[29]=cap[30]=
0
ene[1]=ene[2]=ene[3]=ene[4]=ene[5]=ene[6
]=ene[7]=ene[8]=ene[9]=ene[10]=0
ene[11]=ene[12]=ene[13]=ene[14]=ene[15]=
ene[16]=ene[17]=ene[18]=ene[19]=ene[20]=
0
ene[21]=ene[22]=ene[23]=ene[24]=ene[25]=
ene[26]=ene[27]=ene[28]=ene[29]=ene[30]=
0
cur[1]=cur[2]=cur[3]=cur[4]=cur[5]=cur[6
]=cur[7]=cur[8]=cur[9]=cur[10]=0
cur[11]=cur[12]=cur[13]=cur[14]=cur[15]=
cur[16]=cur[17]=cur[18]=cur[19]=cur[20]=
0
cur[21]=cur[22]=cur[23]=cur[24]=cur[25]=
cur[26]=cur[27]=cur[28]=cur[29]=cur[30]=
0
pot[1]=pot[2]=pot[3]=pot[4]=pot[5]=pot[6
]=pot[7]=pot[8]=pot[9]=pot[10]=0
pot[11]=pot[12]=pot[13]=pot[14]=pot[15]=
pot[16]=pot[17]=pot[18]=pot[19]=pot[20]=
0
pot[31]=pot[32]=pot[33]=pot[34]=pot[35]=
pot[36]=pot[37]=pot[38]=pot[39]=pot[30]=
0
UpDn[1]=UpDn[2]=UpDn[3]=UpDn[4]=UpDn[5]=
UpDn[6]=UpDn[7]=UpDn[8]=UpDn[9]=UpDn[10]
=0
UpDn[11]=UpDn[12]=UpDn[13]=UpDn[14]=UpDn
[15]=UpDn[16]=UpDn[17]=UpDn[18]=UpDn[19]
=UpDn[20]=0
UpDn[21]=UpDn[22]=UpDn[23]=UpDn[24]=UpDn
[25]=UpDn[26]=UpDn[27]=UpDn[28]=UpDn[29]
=UpDn[30]=0
meth[1]=meth[2]=meth[3]=meth[4]=meth[5]=
meth[6]=meth[7]=meth[8]=meth[9]=meth[10]
=0
meth[11]=meth[12]=meth[13]=meth[14]=meth
[15]=meth[16]=meth[17]=meth[18]=meth[19]
=meth[20]=0
meth[21]=meth[22]=meth[23]=meth[24]=meth
[25]=meth[26]=meth[27]=meth[28]=meth[29]
=meth[30]=0

}
Bob Harris

2004-10-13, 3:55 pm

In article <fcb9e60c.0410130600.1dbed2b6@posting.google.com>,
subPlanck@excite.com (entropic) wrote:

I think you are mis-managing the value of 'i'. It is a global because
you did not make it a local.

See my comments intermixed with your code below

> Bob Harris <harris@zk3.dec.com> wrote in message
> news:<harris-AC7BBE.17425309102004@cacnews.cac.cpqcorp.net>...
>
> Since the mystery persists, here's my program (some values, like n and
> filenames, are passed on from the command line). The last loop, now
> commented out, doesn't work, since no values are printed, but if the
> tedious version is active, everything's OK. If I delete array
> elements by delete cur[i], nothing is printed, either. I'm baffled...
>
> z.entropic
>
> ========================================
======================
> FNR == 1 { end_game() }
> END { end_game() }
> OFS = " "
>
> ( $10 == "C" || $10 == "D" ) && ( $11 == 133 || $11 == 132 ) {
>
> cap[i] = $6
> ene[i] = $7
> cur[i] = $8
> pot[i] = $9
> UpDn[i] = $10
> meth[i] = $11


Where is 'i' initialized after FNR==1 ?

As I read this program, after end_game() runs, 'i' is equal to 31

That means you start storing values in cap[31], ene[31], cur[31], etc...

> if ( $6 > f6 ) {
> f6 = $6
> }
>
> fn = FILENAME
> i++
>
> # print n values per file
> if ( i > n ) {
> next
> }
> k = i
> }
>
> function end_game() {
> for ( i = 1; i <= k && f6 && cap[i] && cur[i] > 0; i++ ) {
>
> printf "%s %3.3g %s %3.g %1.2f %1.3f %1.3e %1.3e %5.1f %5.1f %5.1f\n",
> \
> fn, i, UpDn[i], meth[i], pot[i], cap[i]*1000, ene[i]*1000, \
> cur[i]/(cap[3]==0?1e+100:cap[3]), \
> cap[i]/(cap[2]==0?1e+100:cap[2])*100, \
> cap[i]/(cap[3]==0?1e+100:cap[3])*100, \
> cap[i]/(cap[9]==0?1e+100:cap[9])*100
>
> }
> if ( f6 != "" ) {
> print "\n"
> }
> fn = f6 = ""
> i = k = 1


Yes you set i to 1 here, but then in the 'for' loop you change it, and
leave its value at 31 when you return from end_game()

I suggest you create some local variables or make sure all your array
indexes are unique for their purpose.

A local in awk can be created by having dummy arguments in the function
argument list. for example

function myfunction(real_arg, _local_vars_, a, b, c, d, e, f )
{
}

Where real_arg is something I really wanted to pass, but _local_vars_
and all that follow are declared here so that they can be used a local
variables. And there is nothing magical about _local_vars_, I just
named it that to make it easy for me to see that my local variable
declarations follow. It is just another local variable with a funny
name. Nothing more.

Anyway, change your 'for' loops to use some other index ('j' is a nice
variable name, and make it a local variable).

And if 'i' is going to be global variable, then I would suggest giving
it a more meaningful name so that it is more obvious it is global in
nature, and not just 'i' the common throw away for loop index variable.

Bob Harris

> #for ( i = 1; i <= 30; i++ ) {
> # cap[i]=0
> # ene[i]=0
> # cur[i]=0
> # pot[i]=0
> # UpDn[i]=0
> # meth[i]=0
> # }
>
> cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
> cap[11]=cap[12]=cap[13]=cap[14]=cap[15]=
cap[16]=cap[17]=cap[18]=cap[19]=cap[2
> 0]=0
> cap[21]=cap[22]=cap[23]=cap[24]=cap[25]=
cap[26]=cap[27]=cap[28]=cap[29]=cap[3
> 0]=0
> ene[1]=ene[2]=ene[3]=ene[4]=ene[5]=ene[6
]=ene[7]=ene[8]=ene[9]=ene[10]=0
> ene[11]=ene[12]=ene[13]=ene[14]=ene[15]=
ene[16]=ene[17]=ene[18]=ene[19]=ene[2
> 0]=0
> ene[21]=ene[22]=ene[23]=ene[24]=ene[25]=
ene[26]=ene[27]=ene[28]=ene[29]=ene[3
> 0]=0
> cur[1]=cur[2]=cur[3]=cur[4]=cur[5]=cur[6
]=cur[7]=cur[8]=cur[9]=cur[10]=0
> cur[11]=cur[12]=cur[13]=cur[14]=cur[15]=
cur[16]=cur[17]=cur[18]=cur[19]=cur[2
> 0]=0
> cur[21]=cur[22]=cur[23]=cur[24]=cur[25]=
cur[26]=cur[27]=cur[28]=cur[29]=cur[3
> 0]=0
> pot[1]=pot[2]=pot[3]=pot[4]=pot[5]=pot[6
]=pot[7]=pot[8]=pot[9]=pot[10]=0
> pot[11]=pot[12]=pot[13]=pot[14]=pot[15]=
pot[16]=pot[17]=pot[18]=pot[19]=pot[2
> 0]=0
> pot[31]=pot[32]=pot[33]=pot[34]=pot[35]=
pot[36]=pot[37]=pot[38]=pot[39]=pot[3
> 0]=0
> UpDn[1]=UpDn[2]=UpDn[3]=UpDn[4]=UpDn[5]=
UpDn[6]=UpDn[7]=UpDn[8]=UpDn[9]=UpDn[
> 10]=0
> UpDn[11]=UpDn[12]=UpDn[13]=UpDn[14]=UpDn
[15]=UpDn[16]=UpDn[17]=UpDn[18]=UpDn[
> 19]=UpDn[20]=0
> UpDn[21]=UpDn[22]=UpDn[23]=UpDn[24]=UpDn
[25]=UpDn[26]=UpDn[27]=UpDn[28]=UpDn[
> 29]=UpDn[30]=0
> meth[1]=meth[2]=meth[3]=meth[4]=meth[5]=
meth[6]=meth[7]=meth[8]=meth[9]=meth[
> 10]=0
> meth[11]=meth[12]=meth[13]=meth[14]=meth
[15]=meth[16]=meth[17]=meth[18]=meth[
> 19]=meth[20]=0
> meth[21]=meth[22]=meth[23]=meth[24]=meth
[25]=meth[26]=meth[27]=meth[28]=meth[
> 29]=meth[30]=0
>
> }

William James

2004-10-15, 3:55 am

subPlanck@excite.com (entropic) wrote in message news:<fcb9e60c.0410090744.490e3780@posting.google.com>...
> Why doesn't the commented out expression work? I'm trying to avoid
> having to use the repetitive version listed below.
>
> # for ( i = 1; i <= 10; i++ ) {
> # cap[i] = 0
> # }
>
> cap[1]=cap[2]=cap[3]=cap[4]=cap[5]=cap[6
]=cap[7]=cap[8]=cap[9]=cap[10]=0
>
> A non-programmer using MKS Toolkit's awk...
>
> z.entropic


To erase the entire array:

delete cap

If that doesn't work with your awk:

split( "", cap )
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com