Visit Our UNIX and Linux User Community


Executing if dynamic conditions in awk


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Executing if dynamic conditions in awk
# 1  
Old 02-12-2020
Executing if dynamic conditions in awk

Hi All,

I got struck at the below point where i am unable to get the desired output after forming the dynamic conditions.Below is the design.
1. We are getting inputs from the shell arguments and storing in a variable like below.
Code:
CONDITIONS="1=CT,2=US_10,3=CT_US_10"

2. After this i am mapping the position of the fields and storing the condition in the variable as below
Code:
CON=$1 == "CT" && $4 == US_10 && $60 == CT_US_10

3. I wish to apply it in the if statement get the desired output as below, however it is not working.
Code:
usr/bin/awk -v CONDITION="${CON}" 'BEGIN{FS=","}{ if (CONDITION) {print CONDITION"|"$147"|"$15"|"$16"|"$17"|"$4} } '

Can anyone help us

Moderator's Comments:
Mod Comment
There are 2 things you need to notice with regards to your post:

1- Please DO NOT color your text, keep it in simple default format and color.

2- After having these many posts from your in forums we expect you to wrap your samples with CODE TAGS as per forum rules so please always do so.

Thanks & Regards,
MODs team

Last edited by RavinderSingh13; 02-12-2020 at 12:13 PM..
# 2  
Old 02-12-2020
Hi
the question under item 2. is not entirely clear
can you show the code how you are mapping and storing in the variable?
# 3  
Old 02-12-2020
Hi Moderators,
My sincere apologies.
@nezabudka, Please see the below code
Code:
#Shell arguments
#-------------------
sh samplecollector.sh "20200212" "1=CT,2=US_10,3=CT_US_10"

#Inside the script
#----------------------
FILEDATE=$1
CONDITIONS=$2 # Used the values directly in the variable in my post, the condition can be one or many based on user input

/usr/bin/awk -v COND=${CONDITIONS} -F"," 'function strcondition(h,  i,F,v,b,dec) {F=split(h,v,",");for(i=1;i<=F;i++) {split(v[i],b,"=");dec=(dec != "") ? dec""sprintf(" %s == \"%s\" &&",lookup(b[1]),b[2]) : sprintf("%s == \"%s\" &&",lookup(b[1]),b[2]);} sub(/[ &&\t\r\n]+$/, "", dec);return dec;} function lookup(l,  f,ar){ar[1]="$1";ar[2]="$4";ar[3]="$60";ar[4]="$17";ar[5]="$4";if (l in ar) {return ar[l];}} { if(strcondition(COND));{print COND"|"$147"|"$15"|"$16"|"$17"|"$4}}' Record_${FILEDATE}.dat


Last edited by cskumar; 02-12-2020 at 02:56 PM..
# 4  
Old 02-12-2020
And where did you get the CONDITION variable in "awk"?

--- Post updated at 21:59 ---

Is a colon needed here?
Quote:
{ if(strcondition(COND));{print CONDITION"|"$147"|"$15"|"$16"|"$17"|"$4}}'
maybe
Code:
{ if(strcondition(COND))print COND"|"$147"|"$15"|"$16"|"$17"|"$4}

This User Gave Thanks to nezabudka For This Post:
# 5  
Old 02-12-2020
A one or two line data sample would be nice.


The if (...); will do nothing.
The print CONDITION will print an empty entity as the variable is not defined.


Your idea / approach will not work per se. You will need to compile your COND in, e.g. have some text tool write a script which then will be executed by awk.
This User Gave Thanks to RudiC For This Post:
# 6  
Old 02-12-2020
You need to assign the return value from the function "strcondition(COND)" to CONDITION
# 7  
Old 02-12-2020
an ex.:
Code:
CONDITIONS="1=CT,2=US_10,3=CT_US_10"

CON='$1 == "CT" && $4 == "US_10" && $60 == "CT_US_10"'

awk -v CONDITION="${CON}" -F, '
BEGIN {
c=split(CONDITION, cons, " *&& *");
for (i=1; i<=c; i++) {
split(cons[i], cs, " *== *");
sub("[$]", "", cs[1]);
gsub("[\"]", "", cs[2]);
conditions[cs[1]]=cs[2];
}
}
{
n=0;
for (i in conditions) if ($(i)==conditions[i]) n++;
if (n==c) print CONDITION"|"$147"|"$15"|"$16"|"$17"|"$4;
}
' file


Last edited by rdrtx1; 02-18-2020 at 08:23 PM..
This User Gave Thanks to rdrtx1 For This Post:

Previous Thread | Next Thread
Test Your Knowledge in Computers #950
Difficulty: Medium
The first academic work on the theory of self-replicating computer programs was done in 1949 by Alan Turing.
True or False?

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

Shell script executing both the conditions.

I have written this script. This is used for creating a backup folder. #!/bin/sh #set -x . /home/.profile usage="Usage is $0" usage="$usage " # Use the getopt utility to set up the command line flags. set -- `/usr/bin/getopt b: $*` # Process individual command line arguments while ;... (1 Reply)
Discussion started by: arijitsaha
1 Replies

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

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

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

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. UNIX for Advanced & Expert Users

Dynamic Downloading and executing of ELF files

Dear Group, I want to prepare an ELF file which can be downloaded dynamically to any address in the moemory and executes as a new task/thread/process. 1) for this what are all the compileation, linker options while building the ELF file? 2) which parts of ELF file has to modified while... (1 Reply)
Discussion started by: ravinder.are
1 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

Featured Tech Videos