user710818
user710818

Reputation: 24288

How to pass bash parameter to awk script?

I have awk file:

#!/bin/awk -f
BEGIN {

}
{
        filetime[$'$colnumber']++;
}
END {
        for (i in filetime) {
                print filetime[i],i;
        }
}

And bash script:

#!/bin/bash
var1=$1
awk -f myawk.awk

When I run:

ls -la | ./countPar.sh 5

I receive error:

ls -la | ./countPar.sh 5
awk: myawk.awk:6:         filetime[$'$colnumber']++;
awk: myawk.awk:6:                   ^ invalid char ''' in expression

Why? $colnumber must be replaced with 5, so awk should read 5th column of ls ouput. Thanks.

Upvotes: 4

Views: 9730

Answers (3)

VIPIN KUMAR
VIPIN KUMAR

Reputation: 3147

Passing 3 variable to script myscript.sh var1 is the column number on which condition has set. While var2 & var3 are input and temp file.

#!/bin/ksh
var1=$1
var2=$2
var3=$3
awk -v col="${var1}" -f awkscript.awk ${var2} > $var3
mv ${var3} ${var2}

execute it like below -

./myscript.sh 2 file.txt temp.txt

Upvotes: 0

Mat
Mat

Reputation: 206909

You can pass variables to your awk script directly from the command line.

Change this line:

filetime[$'$colnumber']++;

To:

filetime[colnumber]++;

And run:

ls -al | awk -f ./myawk.awk -v colnumber=5

If you really want to use a bash wrapper:

#!/bin/bash
var1=$1
awk -f myawk.awk colnumber=$var1

(with the same change in your script as above.)

If you want to use environment variables use:

#!/bin/bash
export var1=$1
awk -f myawk.awk

and:

filetime[ENVIRON["var1"]]++;

(I really don't understand what the purpose of your awk script is though. The last part could be simplified to:

END { print filetime[colnumber],colnumber; }

and parsing the output of ls is generally a bad idea.)

Upvotes: 5

Zsolt Botykai
Zsolt Botykai

Reputation: 51693

The easiest way to do it:

#!/bin/bash
var=$1
awk -v colnumber="${var}" -f /your/script

But within your awk script, you don't need the $ in front of colnumber.

HTH

Upvotes: 2

Related Questions