awk - Why can't value of awk variables be passed to external functions ?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting awk - Why can't value of awk variables be passed to external functions ?
# 1  
Old 11-22-2014
awk - Why can't value of awk variables be passed to external functions ?

I wrote a very simple script to understand how to call user-defined functions from within awk after reading this post.

Code:
function my_func_local {
echo "In func $1"
}

export -f my_func_local

echo $1 | awk -F"/" '{for (k=1;k<=NF;k++) {
if ($k == "a" ) {
system("my_local_func $k")
}
else{
print $k
}
}                        
}

I am running with the arguments-:
sh script.sh a/b/c/d/e
The expected output should be-:
Code:
In func a
b
c
d
e

But what I am getting is-:
Code:
In func
b
c
d
e

The value of k is not being passed into the external function when I am calling it from awk. Why is this happening ? How do you rectify this ? I need the function to be called within awk because what I am trying to do is take the input of a path from the user and recursively create the directories as I go.

How do I convert the value from $k to its actual value and pass it as a parameter ?
# 2  
Old 11-22-2014
As i see it, not really understanding awk yet, but you're comparing a STRING (a) with an INTEGER (k).
Anyhow, so you pass a list of variables, and when it matches a certain string, you want to call that function?

Must it be awk, because bash works just fine Smilie
Code:
#!/bin/bash
my_func_local() {
    echo "In func: my_func_local $1"
}

for ARG in "${@}";do
    [[ $ARG = a ]] && \
        my_func_local $ARG || \
        echo $ARG
done

Code:
sh script.sh a b c d
In func: my_func_local a
b
c
d

Hope this helps
# 3  
Old 11-22-2014
What you are getting surprises me when I look into the script you post:
If you'd define the function you call correctly, this might work better (my_func_local vs. my_local_func). And, don't put $k into the quotes to have it evaluated for the system call. And, awk uses sh to run the system call. Having symlinked /bin/sh to /bin/bash, I get
Code:
In func a
b
c
d
e

# 4  
Old 11-22-2014
The answer is simple: awk is not shell. Variables don't work that way. $ means column here, and isn't even expanded inside quotes.

Code:
system("my_local_func " k)

# 5  
Old 11-22-2014
Quote:
Originally Posted by RudiC
What you are getting surprises me when I look into the script you post:
If you'd define the function you call correctly, this might work better (my_func_local vs. my_local_func). And, don't put $k into the quotes to have it evaluated for the system call. And, awk uses sh to run the system call. Having symlinked /bin/sh to /bin/bash, I get
Code:
In func a
b
c
d
e

Can you please specify in details what you have done to get the result ? can you post your entire script which shows the symlink ?

---------- Post updated at 11:26 PM ---------- Previous update was at 11:18 PM ----------

Quote:
Originally Posted by Corona688
The answer is simple: awk is not shell. Variables don't work that way. $ means column here, and isn't even expanded inside quotes.

Code:
system("my_local_func " k)

What you have told me to do doesn't work. I am using utilizing the following code now-:
Code:
function my_local_function {
echo $1
}

export -f my_local_function

echo $1 | awk -F"/" '{ for (k=1;k<=NF;k++)
{
if ( $k == "a" ) {
    system("my_local_function" k)
        }
else {
    print $k
    }
    }
}'

I am getting the following erroneous error-:
Code:
sh: my_local_function1: command not found
b
c
d

---------- Post updated at 11:30 PM ---------- Previous update was at 11:26 PM ----------

Quote:
Originally Posted by sea
As i see it, not really understanding awk yet, but you're comparing a STRING (a) with an INTEGER (k).
Anyhow, so you pass a list of variables, and when it matches a certain string, you want to call that function?

Must it be awk, because bash works just fine Smilie
Code:
#!/bin/bash
my_func_local() {
    echo "In func: my_func_local $1"
}

for ARG in "${@}";do
    [[ $ARG = a ]] && \
        my_func_local $ARG || \
        echo $ARG
done

Code:
sh script.sh a b c d
In func: my_func_local a
b
c
d

Hope this helps
Can you please explain to me what your script means step by step ? Sorry for being blunt but I am comfortable with awk rather than raw shell scripting. However for this problem it does not matter what I use so if you can explain how your script works then it would be fine for my purpose.
# 6  
Old 11-22-2014
As requested:
Code:
sudo ln -sf /bin/bash /bin/sh
echo "a/b/c/d/e" |
awk -F"/"       '{for (k=1;k<=NF;k++)   {if ($k == "a" )        {system("my_func_local " $k)}
                                         else                   {print $k}
                                        }
                 }
                '
In func a
b
c
d
e

Don't forget to recreate the original sh symlink.

Last edited by RudiC; 11-23-2014 at 09:31 AM.. Reason: typo
This User Gave Thanks to RudiC For This Post:
# 7  
Old 11-22-2014
Quote:
Originally Posted by RudiC
As required:
Code:
sudo ln -sf /bin/bash /bin/sh
echo "a/b/c/d/e" |
awk -F"/"       '{for (k=1;k<=NF;k++)   {if ($k == "a" )        {system("my_func_local " $k)}
                                         else                   {print $k}
                                        }
                 }
                '
In func a
b
c
d
e

Don't forget to recreate the original sh symlink.
Thanks. But can you tell me why did you need to create a symlink /bin/sh for this to work ? I mean whats the logic behind this. Why wasn't it working before ?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Shell Variables passed to awk to return certain rows

Hi Forum. I have the following test.txt file and need to extract certain rows based on "starting position", "length of string" and "string to search for": 1a2b3d 2a3c4d ..... My script accepts 3 parameters: (starting col pos, length to search for, string to search for) and would like to... (4 Replies)
Discussion started by: pchang
4 Replies

2. Shell Programming and Scripting

awk processing of passed variables

Currently have this: set current=192.168.0.5 set servicehost = `echo $current | awk -F. '{print $4}'` echo $numberoffields 5 ..but would like to reduce # of variables and eliminate echo to have something like this: set servicehost = `awk -v s="$current" -F. 'BEGIN{print $2}'`But... (3 Replies)
Discussion started by: Mid Ocean
3 Replies

3. Shell Programming and Scripting

ksh passing to awk multiple dyanamic variables awk -v

Using ksh to call a function which has awk script embedded. It parses a long two element list file, filled with text numbers (I want column 2, beginning no sooner than line 45, that's the only known thing) . It's unknown where to start or end the data collection, dynamic variables will be used. ... (1 Reply)
Discussion started by: highnthemnts
1 Replies

4. Shell Programming and Scripting

Assign value to external variables from awk

Hello I have a text file with the next pattern Name,Year,Grade1,Grade2,Grade3 Name,Year,Grade1,Grade2,Grade3 Name,Year,Grade1,Grade2,Grade3 I want to assign to external variables the grades using the awk method. After i read the file line by line in order to get the grades i use this ... (2 Replies)
Discussion started by: Spleshmen
2 Replies

5. Shell Programming and Scripting

arithmetic from csh variable passed to awk

I have the following code in a csh script I want to pass the value of the variable sigmasq to the awk script so that I can divide $0 by the value of sigmasq grep "Rms Value" $f.log \ | awk '{ sub(/*:*\.*/,x); \ print... (2 Replies)
Discussion started by: kristinu
2 Replies

6. Shell Programming and Scripting

flags passed to an awk script

I have an awk script script.awk for example and want to pass a flag (let's call it "neat") so that the data is put into nice columns. For example like this awk -v neat -f script.awk fin > fout Then check inside the program if the use has put neat, if yes I output the lines in nice columns,... (1 Reply)
Discussion started by: kristinu
1 Replies

7. Shell Programming and Scripting

AWK: Retrieving names of variables passed with -v

I'm an experienced awk user, but this one has me stumped. I have an awk script which is called from a UNIX command line as you'd expect: myscript.awk -v foo=$1 -v bar=$2 filename My question is this: is there a mechanism for determining the names of the -v variables within a script? ... (3 Replies)
Discussion started by: John Mac
3 Replies

8. Shell Programming and Scripting

awk - arithemetic functions with external variables

I'm trying to get awk to do arithmetic functions with external variables and I'm getting an error that I cannot figure out how to fix. Insight would be appreciated money=$1 rate1=$(awk -F"\t " '/'$converting'/{print $3}' convert.table) rate2=$(awk -F"\t"... (2 Replies)
Discussion started by: DKNUCKLES
2 Replies

9. UNIX for Dummies Questions & Answers

variable passed to awk

Does anybody know how to print a variable passed to awk command? awk -F"|" 'BEGIN {print $job,"\n","Question \n"} {print $1,$2$4," ",$3}' "job=$job1" file1 I am trying to pass job the variable job1. the output is blank. ?? (3 Replies)
Discussion started by: whatisthis
3 Replies

10. UNIX for Dummies Questions & Answers

variable passed to awk

Anybody know what's wrong with this syntax? awk -v job="$job" 'BEGIN { FS="|"} {print $1,$2," ",$4," ",$3\n,$5,"\n"}' list It's keeping give me this message: awk: syntax error near line 1 awk: bailing out near line 1 It seems awk has problem with my BEGIN command. Any... (8 Replies)
Discussion started by: whatisthis
8 Replies
Login or Register to Ask a Question