Sequence of conditions awk


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Sequence of conditions awk
# 1  
Old 04-15-2015
Sequence of conditions awk

hello gurus,

I want to use an associative array from a file to populate a field of another file, by matching several columns in order of priority. If the first column matches, then i dont want to match $2. Similarly I only want to match $3 when $1 and $2 are not in associative array.

For the following piece of code, all the steps are sequentially executed.



Code:
awk 'NR==FNR{array[$1]=$2;next}
                      $1 in array { $5=array[$1]}
                      $2 in array { $5=array[$2] }
                      $3 in array { $5=array[$3] }1' file1 file2


How do I code if condition here if I want to execute a row if only the upper one was not met?


like

Code:
awk 'NR==FNR{array[$1]=$2;next}
                      $1 in array { $5=array[$1]}

If not $1 in array

                      $2 in array { $5=array[$2] }

If not $1 and $2 in array

                      $3 in array { $5=array[$3] }1' file1 file2


I have 13 such conditions, so just wanted to learn how it is coded

Last edited by ritakadm; 04-15-2015 at 07:51 PM..
# 2  
Old 04-15-2015
Since you didn't give any sample data, and your "13 such conditions" leaves a lot to the imagination, I could guess that something like this might give you a starting point for your script. (This is untested, but should be close to a working script.)
Code:
awk '
FNR == NR {
	array[$1] = $2
	next
}
{	for(i = 1; i <= 13; i++)
		if($i in array) break
	if(i <= 13)
		$5 = array[$i]
}
1' file1 file2

with the usual comment that if you want to try this on a Solaris/SunOS system, you need to change awk to /usr/xpg4/bin/awk.
# 3  
Old 04-16-2015
I have to second Don Cragun, your description is far from clear. Can I paraphrase it in a way that "check if field 1..13 are an index into array, on first match assign that element to field 5 and quit the check"?
If yes, I guess Don Cragun's proposal needs a small modification:
Code:
awk     '
FNR == NR       {array[$1] = $2
                 next
                }
                {for (i = 1; i <= 13; i++)
                        if($i in array) {$5 = array[$i]
                                         break
                                        }
                }
1
        ' file1 file2

What about field 5?
# 4  
Old 04-16-2015
Hi RudiC,
My suggestion has one additional test in it that yours skips (so I like your version better), but I don't see that there should be any difference in the output produced by our suggestions. Am I missing something???

- Don
# 5  
Old 04-16-2015
Isnt this a simple case of else if ? Loop would be better of course if i runs from 1 to 13, but for checking specific columns it may be better to use else if .

Code:
awk 'NR==FNR{array[$1]=$2;next}
                     { if ( $1 in array ) { $5=array[$1]}
                      else if ($2 in array) { $5=array[$2] }
                      else if ($3 in array) { $5=array[$3] }1' file1 file2

# 6  
Old 04-16-2015
Quote:
Originally Posted by senhia83
Isnt this a simple case of else if ? Loop would be better of course if i runs from 1 to 13, but for checking specific columns it may be better to use else if .

Code:
awk 'NR==FNR{array[$1]=$2;next}
                     { if ( $1 in array ) { $5=array[$1]}
                      else if ($2 in array) { $5=array[$2] }
                      else if ($3 in array) { $5=array[$3] }1' file1 file2

Yes, if... Smilie

If we knew what was really wanted we could all make better suggestions. When we're just given a pattern of three consecutive fields being checked and a statement that 13 fields will be checked, we have to guess at what should be done. With consecutive fields, a loop is probably better; with non-consecutive fields an if-else ladder or a loop over an array listing the fields to be tested will be needed. If the 13 field numbers are fixed but not consecutive, an if-else ladder will be faster. If the fields to be tested vary from invocation to invocation, creating an array of fields to be evaluated is a lot easier to set up the code in a BEGIN clause from command line or file input than rewriting an if-else ladder on the fly.

That is why threads are much shorter and suggestions are much better and usually arrive quicker when the requirements are carefully and clearly specified in the 1st post in a thread. Smilie
# 7  
Old 04-16-2015
Quote:
Originally Posted by Don Cragun
Hi RudiC,
My suggestion has one additional test in it that yours skips (so I like your version better), but I don't see that there should be any difference in the output produced by our suggestions. Am I missing something???

- Don
I think I totally misinterpreted your proposal on first read, ignoring the indentation and thinking the break would also skip the assignment. Which is not the case, on second/third read. My apologies.
This User Gave Thanks to RudiC For This Post:
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

awk problems - awk ignores conditions

awk 'BEGIN{ if('"$CATE"'<'"${WARN}"') printf ("%s", "'"`Kfunc "" ; break`"'") else if (('"${CATE}"'>='"${WARN}"') && ('"${CATE}"'<'"${CRIT}"')) printf ("%s", "'"`Wfunc ""; break`"'") else if ('"${CATE}"'>='"${CRIT}"') printf... (6 Replies)
Discussion started by: SkySmart
6 Replies

2. Shell Programming and Scripting

If conditions in awk

Hello Friends, I need to find some CDRs in production servers whose 1st field value and 2nd field value = 1 and 11th looks like 45.123... where there are more than 3 digits after comma.so i wrote a one liner, something like below but does not work, however when i used first and second conditions... (8 Replies)
Discussion started by: EAGL€
8 Replies

3. Shell Programming and Scripting

awk three conditions

I'm having a problem pulling UID's from data. The data outputs a user's UID in one of three ways: 1. Error User user_name already assigned with <UID> 2. Success <UID> reserved for user_name 3. <a load of crap because there was a db failure yet somehow the UID is still in there> I typically... (5 Replies)
Discussion started by: MaindotC
5 Replies

4. Shell Programming and Scripting

awk with conditions

Hi All, I have a file with below contents. "en2"/10.185.81.0:cluster_interconnect,"en5"/10.185.81.0:cluster_interconnect,"en6"/169.181.146.0:public I want to take the interface name from the file and convert it as ipaddress using ifconfig command get the output like below en6 ->... (2 Replies)
Discussion started by: kamauv234
2 Replies

5. Shell Programming and Scripting

Conditions in awk

Hi there, here is my command ssh host.local "/path/to/my/perscript/hostconfig.pl -s $HOST -d |awk '{if (\$4 > 120)print \"My error message\";exit}{s=0; for (i=1; i<=NF; i++) s++; if(s == 13) print \$3}'" The problem is if conditional 1 is met (i.e $4 > 120), i don't see "My error message", the... (5 Replies)
Discussion started by: urello
5 Replies

6. Shell Programming and Scripting

awk line with two conditions

Hi there, I wanna define a variable 'tempbase'. Therefore I read a text file "base.out". "base.out" contains a list with four columns. 'tempbase' is the 4th entry in the line, where the first entry is equal to the predefined variable $orb1 and the second entry is equal to $orb2. I wrote the code... (2 Replies)
Discussion started by: friend
2 Replies

7. Shell Programming and Scripting

awk with two conditions

Hi Everyone, # cat 1 1;2;3;4;5;6 1;2;3;4;5; # awk -F ";" '$5 == "5"' 1 1;2;3;4;5;6 1;2;3;4;5; but the output is should be just "1;2;3;4;5;6" means 1st condition: $5 is 5; 2nd condition: $6 is not empty, please advice. Thanks (2 Replies)
Discussion started by: jimmy_y
2 Replies

8. Shell Programming and Scripting

specifying multiple conditions in AWK

how can i specify more than 1 consition in the following AWK statament?? i.e. if $2 is ABCD and $3 is MNOP and $4 is KLPM similarly for OR #!/bin/ksh awk -F '' ' $2 == "ABCD" { print $2, $3;}' file.xml (2 Replies)
Discussion started by: skyineyes
2 Replies

9. Shell Programming and Scripting

if, sed or awk with conditions

I do not know how to do this unless I use a bunch of if statements. I need a script to replace numbers in each record in a file. I am really getting tangled in this web. If a fieldA (19 positions) is greater than 14 digits, I have to change the data (resulting fieldA is fixed 19 postions). If... (5 Replies)
Discussion started by: ski
5 Replies

10. Shell Programming and Scripting

About awk conditions

Hello, Can you explain why in the first 2 commands the awk does not print anything? Is it looking of a specific format ? Thanks. $ echo 12a3 | awk '($1>=2) {print $1}' # prints nothing $ echo 123a | awk '($1>=2) {print $1}' # prints nothing $ echo a123 | awk '($1>=2) {print $1}' a123... (1 Reply)
Discussion started by: majormark
1 Replies
Login or Register to Ask a Question