JBoy
JBoy

Reputation: 5745

awk function printing..... -bash?

For some reason that i'm trying to figure out i'm getting "-bash" printed out of this script:

cat sample | awk -v al=$0 -F"|" '{n = split(al, a, "|")} {print a[1]}'

the 'sample' file contains psv "pipe separated value", like a|b|c|d|e|f|d.
My intention is to use an array.
The result of the above script is an array of length 1 and th only item contained is "-bash", the name of the shell.
$0 by default points to the program that is currently used, but as far as i know, within an awk script, the $0 parameter 'should' point to the entire line being read.

since i would like to understand where the problem exaclty is "i'm new to bash/awk" can you point me out which of the following steps is failing?
1-"concatenate" the sample file and pass it as input for the awk script
2-define a variable named 'al' with as value each line contained in 'sample'
3-define a pipe "|" as field separator
4-define an action, split the value of 'al' into an array named 'a' using a pipe as splitter
5-define another action, which in this case is simply printing the first item in the array

Any advice? thank you!

Upvotes: 0

Views: 322

Answers (3)

Jonathan Wakely
Jonathan Wakely

Reputation: 171383

The $0 is expanded by the shell before it runs awk, and $0 is the name of the current program, which is bash, the - at the start is because bash was run by login(1) (see the description of the exec builtin in man bash)

You need to quote the $0 so the shell doesn't expand it, and awk sees it:

awk -v 'al=$0' -F"|" '{n = split(al, a, "|")} {print a[1]}' sample

But variable assignments are processed before reading any data, so that sets the variable al to the string "$0" at the start of the program, it does not set al to the contents of each input record.

If you want the record, just say so instead of using a variable:

awk -F"|" '{n = split($0, a, "|")} {print a[1]}' sample

Upvotes: 2

choroba
choroba

Reputation: 242008

By -v a1=$0, you are setting a1 to the name of the current programme, which is bash. See Arguments in man bash.

Upvotes: 1

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 799150

Err...

awk -F'|' '{ print $1 }' sample

Upvotes: 0

Related Questions