Problem using if else in awk


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problem using if else in awk
# 1  
Old 11-14-2013
Code Problem using if else in awk

Hi, i am using Solaris ksh shell, i have a file processed from one of the processes as :

Quote:
List00 11 24 54 32 WO
obj001 06 01 00 02 CO
obj002 01 01 03 00 WO
objFW1 00 01 00 00 WO
obj003 01 04 09 13 WA
objFW2 00 03 02 07 CO
obj004 03 14 30 10 WA
List00 contains the objects within it, with rightmost column(i.e 6th column) denoting the state of entire list or the object. I wanted to assign a status to the List00 using a function chkstate () as:

Code:
chkstate () {
name=$( cat file | awk 'NR==1 { print $1 }' );
state=$( cat file | awk 'NR==1 { if ( $6=="AC" || $6=="WA" ) print "Waiting"; else print"NA" }' );
if [[ "${state}" == "NA" ]]; then
state=$( cat file | grep .FW. | awk '{if ( $6=="WO" ) print"Watching"; else print"NA"}' );
fi
if [[ "${state}" == "NA" ]]; then
state=$( cat file | grep -v .FW. | grep -v List* | grep -v '^$' | awk '{ if ( $6=="WO" ) print "InProgress"; else print"NA" }' );
fi
if [[ "${state}" == "NA" ]]; then
state=$( cat file | grep -v .FW. | grep -v List* | grep -v '^$' | awk '{ if ( $6=="CO" ) print "Completed"; else print"NA" }' );
fi
echo "from chkstate () ";
echo $name;
echo $state;
}

the Constraints are:
Quote:
if List00 itself is AC(activated) or WA(waiting) state, state must be "Waiting",
#this part works fine for me

else if any of the objFW1 or objFW2 are in WO(working) state, state must be "watching"
#here for diffrent $6 values i m getting concatenated states like
# "NA Watching" or "Watching NA" depending on the state of FW objects
# so the "NA" state is not moving further in the code for anallysis.

else if any object (other than objFW1 and objFW2) are in WO(working) state, state must be "InProgress"
#the same problem as for constraint above

else if all the object (other than objFW1 and objFW2) are in CO(Completed) state, state must be "Completed"
#same problem as above two constraints #CO in other objects indirectly implies FW objects #are completed.

else when none of the states (Waiting,Watching,InProgress,Completed) apply to List00, state must remain "NA"
#very unlikely to have this state, but assigning
#just to ensure the logic is not wrong any time
As you can see, i do have a code but its badly optimized. I tried break in if inside awk but that too dint work well for me. Presently i m doing this manually but that's a hectic job to do as i have many such Lists to
analyse. Can someone please help me to optimize the function suited to the constraints, that would be a great help !!!
# 2  
Old 11-14-2013
Code:
mute@thedoctor:~/temp/pr5439$ ./script
Watching

this is the code... i think it's right... Smilie
Code:
mute@thedoctor:~/temp/pr5439$ cat script
chkstate() {
        awk '
                NR==1 && ($NF == "AC" || $NF == "WA") {
                        state="Waiting"
                        exit
                }
                ($1 ~ /^objFW/) && ($NF == "WO") {
                        state="Watching"
                        exit
                }
                ($1 !~ /^objFW/) {
                        obj++
                        if ($NF == "WO") objWO++
                        if ($NF == "CO") objCO++
                }
                END {
                        if (!state) {
                                if (objCO == obj)
                                        state="Completed"
                                else if (objWO > 0)
                                        state="InProgress"
                                else
                                        state="NA"
                        }
                        print state
                }' "$1"
}

chkstate file

This User Gave Thanks to neutronscott For This Post:
# 3  
Old 11-14-2013
thanks neutronscott, your code seems to solve most of it, but one logic is missed here. May be one of the constraints was not totally explained, i'll elaborate that again:
Quote:
else if any object (other than objFW1 and objFW2 and List00 ) are in WO(working) state, despite rest objects in WA(waiting) or AC(activated) state, state must be "InProgress"
your code snippet here, ignores WA state of obj003 and obj004 and returns a NA(implies wrong logic if state = NA after all checks) state if all FW objects are CO(completed)
Code:
($1 !~ /^objFW/) {
                        obj++
                        if ($NF == "WO") objWO++
                        if ($NF == "CO") objCO++
                }
                END {
                        if (!state) {
                                if (objCO == obj)
                                        state="Completed"
                                else if (objWO > 0)
                                        state="InProgress"
                                else
                                        state="NA"
                        }
                        print state
                }' "$1"

I myself will try on that but any help from anyone too is very welcome. i think slight tweak in the conditional part will serve the purpose.

Last edited by pr5439; 11-14-2013 at 03:58 PM..
# 4  
Old 11-14-2013
Quote:
Originally Posted by pr5439
your code snippet here, ignores WA state of obj003 and obj004 and returns a NA(implies wrong logic if state = NA after all checks) state if all FW objects are CO(completed)
Your description said WO, yet you're now saying WA. Is it WO or WA? I'm not quite sure what we're working with, but it doesn't matter I suppose.

Could you provide the same input that gives the wrong results as well?
# 5  
Old 11-14-2013
Quote:
List00 11 24 54 32 WO
obj001 06 01 00 02 CO
obj002 01 01 03 00 WO
objFW1 00 01 00 00 CO
obj003 01 04 09 13 WA
objFW2 00 03 02 07 CO
obj004 03 14 30 10 WA
here, besides one object working(WO) we have two objects waiting (WA) when all FW objects are completed(CO). Under such a case i must get InProgress state (if any object other than objFW1 and objFW2 is WO then list has a state of InProgress)

Last edited by pr5439; 11-14-2013 at 05:23 PM.. Reason: wrongly mentioned info
# 6  
Old 11-14-2013
It seems to operate correctly here:

Code:
mute@thedoctor:~/temp/pr5439$ cat file
List00 11 24 54 32 WO
obj001 06 01 00 02 CO
obj002 01 01 03 00 WO
objFW1 00 01 00 00 CO
obj003 01 04 09 13 WA
objFW2 00 03 02 07 CO
obj004 03 14 30 10 WA
mute@thedoctor:~/temp/pr5439$ ./script
InProgress

One thing that would probably always give an "NA" is improper line endings:

Code:
mute@thedoctor:~/temp/pr5439$ ./script
NA
mute@thedoctor:~/temp/pr5439$ file file
file: ASCII text, with CRLF line terminators
mute@thedoctor:~/temp/pr5439$ tr -d '\r' <file >new && mv new file
mute@thedoctor:~/temp/pr5439$ ./script
InProgress

This User Gave Thanks to neutronscott For This Post:
# 7  
Old 11-15-2013
Perhaps you are rite. Totally my mistake, after revisiting your code i found there is nothing wrong with the code and is the most elegant solution that can ever be for the situation.

Thanks neutronscott !!!! Smilie

All i knew about awk is that it starts with the first field of first record and progresses till the end of record visiting every field only once. But the execution flow in your solution seems different to me(may be i am wrong). Can u briefly explain if my understanding is correct or not ?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk problem

Hi I have two columns and I would like to create a third column based on how many lines away from a value of 1 in column 2, for example I have 1,0 2,0 3,0 4,0 5,0 6,1 7,0 8,0 9,0 10,0 11,1 And I want an output (6 Replies)
Discussion started by: garethsays
6 Replies

2. Shell Programming and Scripting

awk problem

i have an email list in file.txt with comma separated line1 - FIELD1,pippo@gmail.com,darth@gmail.com line2 - FIELD2,pippo@gmail.com,darth@gmail.com,sampei@gmail.com output=(awk -F ',' -v var="$awkvar" '$1==var {print $2,$3,$4}' spreadsheet.txt)but awk delete some letters at the... (8 Replies)
Discussion started by: pasaico
8 Replies

3. Shell Programming and Scripting

awk problem - combining awk statements

i have a datafile that has several lines that look like this: 2,dataflow,Sun Mar 17 16:50:01 2013,1363539001,2990,excelsheet,660,mortar,660,4 using the following command: awk -F, '{$3=strftime("%a %b %d %T %Y,%s",$3)}1' OFS=, $DATAFILE | egrep -v "\-OLDISSUES," | ${AWK} "/${MONTH} ${DAY}... (7 Replies)
Discussion started by: SkySmart
7 Replies

4. UNIX for Dummies Questions & Answers

Little problem with AWK

I thought I had solved this problem but after testing the script I came to realize that it is not doing what I need. So, here it goes again. This is the code: awk '/\>/{F=$2; N=$3; split(FILENAME, A, "."); getline; x = ">"}{print ">" A"-" x++" "F" " N"\n" $0}' This is the input file: ... (5 Replies)
Discussion started by: Xterra
5 Replies

5. Shell Programming and Scripting

awk problem

Find the number of files with sizes > 100KB in /, /bin, /usr, /usr/bin and /usr/sbin directories and output them in a two column format with the name of the directory and the number of files. i tried with awk $>ls -lh | awk '/^-/ && $5 >= 100k {print $8 $5}' but it is not working pls tell... (3 Replies)
Discussion started by: abhikamune
3 Replies

6. Shell Programming and Scripting

Problem with awk awk: program limit exceeded: sprintf buffer size=1020

Hi I have many problems with a script. I have a script that formats a text file but always prints the same error when i try to execute it The code is that: { if (NF==17){ print $0 }else{ fields=NF; all=$0; while... (2 Replies)
Discussion started by: fate
2 Replies

7. Shell Programming and Scripting

Awk problem: How to express the single quote(') by using awk print function

Actually I got a list of file end with *.txt I want to use the same command apply to all the *.txt Thus I try to find out the fastest way to write those same command in a script and then want to let them run automatics. For example: I got the file below: file1.txt file2.txt file3.txt... (4 Replies)
Discussion started by: patrick87
4 Replies

8. Shell Programming and Scripting

problem using awk

Hi there every body I'm new to shell scripting and there is a problem facing me,, please look at the following piece of code: awk ' BEGIN{ FS="<assertion id=\1"; RS="<assertion id=\"2"}/<assertion id=\"1/{print FS$2 > "/home/ds2/test/output.txt"} ' filename all I wanna do is to... (6 Replies)
Discussion started by: senior_ahmed
6 Replies

9. Shell Programming and Scripting

Problem with AWK

Hi All, How can i store a value of the unix command executed in AWK with system command. devise=`cut -c1-3 dvgp.txt` I wrote this command in awk as awk'{ code= sprintf("devise=`cut -c1-3 dvgp.txt`"); system(code); }' Is this correct. can you please suggest me how the code can be... (1 Reply)
Discussion started by: krishna_gnv
1 Replies

10. UNIX for Dummies Questions & Answers

AWK Problem

Hi, I posted something here about this yesterday but I can't seem to find it. I needed help writting a script which would append a file with new lines after every so many charachters. Example: (my original flat file) L60 LETTER OF CREDIT 60 DAYS W00 ON RECEIPT WIRE TRANSFER W30 NET... (12 Replies)
Discussion started by: gseyforth
12 Replies
Login or Register to Ask a Question