Looping in awk


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Looping in awk
# 1  
Old 05-30-2002
Looping in awk

Can somebody give me a cleaner way of writing the following script. I was thinking that I could use a loop in the awk statement. It works fine the way it is but I just want the script to be cleaner.

Code:
#!/usr/bin/sh

for r in 0 1 2 3 4 5 6 
do
  DAY[$r]=`gdate --date="${r} days ago" +%m\/%d\/%y`
done


cd /opt/daybreakp/logs
for i in accx24oac.log crbx01.log.X1 cssx108oac.log dbkx05.log dbkx12.log dbkx13.log glix10oac.log salx17oac.log
do
  cat $i | awk '($1 == "'${DAY[0]}'" ||
                 $1 == "'${DAY[1]}'" ||
                 $1 == "'${DAY[2]}'" ||
                 $1 == "'${DAY[3]}'" ||
                 $1 == "'${DAY[4]}'" ||
                 $1 == "'${DAY[5]}'" ||
                 $1 == "'${DAY[6]}'" ) {print $0}' > /tmp/$i.tmp
  mv /tmp/$i.tmp $i
done

Thanks to LivinFree's constant nagging I've decided to try to re-write all of my scripts to be as efficient and clean as possible. Thanks LivinFreeSmilie

added code tags for readability --oombera

Last edited by oombera; 02-20-2004 at 02:20 PM..
# 2  
Old 05-30-2002
You can use the $r from the first loop by adding a second for statement in the middle of the second one. Then you can replace the "0-6" with "$r" instead!

It looks like you are reading $i twice. Once in the for statement and then again with the "cat $i". I am not sure if you are using data in the $i or just using it for the looping or both. So you may need to keep that portion.

1) move the first done to the end of the whole script
2) use the $r from the first loop for the second loop. I try to use variables wherever possible.


cd /opt/daybreakp/logs
for i in accx24oac.log crbx01.log.X1 cssx108oac.log dbkx05.log dbkx12.log dbkx13.log glix10oac.log salx17oac.log
do

for r in "0 1 2 3 4 5 6"

cat $i | awk '($1 == "'${DAY[$r]}''" ) {print $0}' > /tmp/$i.tmp

mv /tmp/$i.tmp $i
done
done

I am not sure that is what you want above. MAYBE LIKE THIS NEXT ONE BELOW...

cd /opt/daybreakp/logs
for i in accx24oac.log crbx01.log.X1 cssx108oac.log dbkx05.log dbkx12.log dbkx13.log glix10oac.log salx17oac.log
do


for r in "0 1 2 3 4 5 6"

cat $i | awk '($1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ||
$1 == "'${DAY[$r]}'" ) {print $0}' > /tmp/$i.tmp
mv /tmp/$i.tmp $i
done
done



The less hardcoding of values and the more variables that you use the less headache you will have later or when someone else has to edit your code.


Smilie Smilie
# 3  
Old 05-30-2002
This doesn't make sense to me. It seems like in your first example you will be reading each file 7 times.

And in the second example $DAY[$r] is not set nor is it looping within the awk statement, it is just using the same variable 7 times in a row. What I need is to compare dates from the last 7 days format "mm/dd/yy".

My only intention in posting the thread was to try to loop within awk rather than iterating the line $1 == "'${DAY[0....6]}'" 6 extra times.
# 4  
Old 05-31-2002
Well, since this is somehow my fault, I though it's only fair for me to pitch in... Smilie

If you like loops:
Code:
#!/usr/bin/sh

cd /opt/daybreakp/logs
file_list="accx24oac.log crbx01.log.X1 cssx108oac.log dbkx05.log dbkx12.log dbkx13.log glix10oac.log
salx17oac.log"

for r in 0 1 2 3 4 5 6; do
DAY[$r]=$(gdate --date="$r days ago" +%m/%d/%y)
done

for each in $file_list; do
  IFS=""
  while read line; do
   case $line in
    ${DAY[0]}*) echo $line ;;
    ${DAY[1]}*) echo $line ;;
    ${DAY[2]}*) echo $line ;;
    ${DAY[3]}*) echo $line ;;
    ${DAY[4]}*) echo $line ;;
    ${DAY[5]}*) echo $line ;;
    ${DAY[6]}*) echo $line ;;
   esac
  done < ${each} >/tmp/${each}.tmp
mv /tmp/${each}.tmp ${each}
done

If you like short code:
Code:
#!/usr/bin/sh
cd /opt/daybreakp/logs
file_list="accx24oac.log crbx01.log.X1 cssx108oac.log dbkx05.log dbkx12.log dbkx13.log glix10oac.log
salx17oac.log"

last_date=$(gdate --date="6 days ago" +%m/%d/%y)
for file in $file_list; do
sed -n "\#${last_date}#,\$p" $file > /tmp/${file}.tmp
mv /tmp/${file}.tmp $file
done

And I know there's got to be an even better way of doing this with sed by deleting everything above lines beginning with the date one week ago... I'm not sure if that made sense, but here is the format of those files:

05/30/02 INFO- blah blah blah
05/30/02 MORE INFO blah blah blah
[a few hundred lines similar to above]
05/31/02 SOME STUFF blah
05/31/02 MORE STUFF blap
[a few hundred more of those]

He's just trying to trim the old lines off the top of the file...
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk nested looping?

I am trying to parse a text file and send its output to another file but I am having trouble conceptualizing how I am supposed to do this in awk. The text file has a organization like so: Name Date Status Location (city, state, zip fields) Where each of these is on a separate line in... (1 Reply)
Discussion started by: kellyanneghj
1 Replies

2. Shell Programming and Scripting

Help on looping using awk

I have the data like this: PONUMBER,SUPPLIER,LINEITEM,SPLITLINE,LINEAMOUNT,CURRENCY IR5555,Supplier1,1,1,83.1,USD IR5555,Supplier1,1,3,40.4,USD IR5555,Supplier1,1,6,54.1,USD IR5555,Supplier1,1,8,75.1,USD IR5556,Supplier2,1,1,41.1,USD IR5556,Supplier2,1,3,43.1,USD ... (3 Replies)
Discussion started by: jeffreybsu
3 Replies

3. Shell Programming and Scripting

Looping through pairs of files with awk

Hi all, please help me construct the command. i want to loop through all files named bam* and bed*. My awk works for a particular pair but there are too many pairs to do manually. I have generated multiple files in a folder in a given pattern. The files are named like bam_fixed1.bam... (2 Replies)
Discussion started by: newbie83
2 Replies

4. Shell Programming and Scripting

AWK looping over 2 variables

I would like to loop over variables i and j consecutively, { a = -6.7 b = 7.0 c =0.1 { for (i = 0; i<=(b-a)/c; i++) for (j = 1; j<=(b-a)/c; j++) '$1<=(a+j*c)&&$1>=(a+i*c)' FILENAME > output_j '{print $2}' output_j > output_j_f } I essentially want to print the range of $1... (9 Replies)
Discussion started by: chrisjorg
9 Replies

5. Shell Programming and Scripting

Looping within the elements of a file using awk

Hi all, I have a file containing 5000 rows and 4 columns. I need to do a loop within the rows based on the values of column 3. my sample data is formatted like the ones below: what i need to do is to make a loop that will allow me to plot the values of x,y,values corresponding to month 1 to month... (10 Replies)
Discussion started by: ida1215
10 Replies

6. Shell Programming and Scripting

looping in awk

How do I remove last comma? echo "xx yy zz" | awk 'BEGIN{FS=" "}{for (i=1; i<=NF; i++) printf "%s,", $i}'output: xx,yy,zz, required output: xx,yy,zz or (ideally!): xx, yy & zz many thanks in advance! (4 Replies)
Discussion started by: euval
4 Replies

7. UNIX for Dummies Questions & Answers

Help with AWK looping

I'm trying to parse a configuration text file using awk. The following is a sample from the file I'm searching. I can retrieve the formula and recipe names easily but now I want to take it one step farther. In addition to the formula name, I would like to also get the value of the attribute... (6 Replies)
Discussion started by: new2awk
6 Replies

8. Shell Programming and Scripting

Urgent - Looping using AWK

Hi I have a file which is having following text. The file is in a tabular form with 5 fields. i.e field1, field2 ..... field5 are its columns and there are many rows in it say COUNT is the number of rows Field 1 Field2 Field3 Field4 Field5 ------- ------- ... (8 Replies)
Discussion started by: skyineyes
8 Replies

9. Shell Programming and Scripting

looping and awk/sed help

I am pretty new to this, but imagine what I am trying to do is possible iI am trying to make an automated DB comparison tool that selects all columns in all tables and compares them to the same thing in another DB. anyway I have created 2 files to help with this the first file is a... (13 Replies)
Discussion started by: Zelp
13 Replies

10. Shell Programming and Scripting

Awk: looping problem!

I am having a problem with awk when I run it with a loop. It works perfectly when I echo a single line from the commandline. For example: echo 'MFG009 9153852832' | awk '$2 ~ /^0-9]$/{print $2}' The Awk command above will print field 2 if field 2 matches 10 digits, but when I run the loop... (5 Replies)
Discussion started by: cstovall
5 Replies
Login or Register to Ask a Question