user7141545
user7141545

Reputation: 51

awk print variable with spaces

How do I pass a variable containing a space to awk as one variable?

code:

a="one"
b="two three"
c="four"
echo $a $b $c | awk '{ print "A="$1 "\nB="$2 "\nC="$3 }'

expected output:

A=one
B=two three
C=four

actual output:

A=one
B=two
C=three

Upvotes: 5

Views: 8666

Answers (3)

Jean-François Fabre
Jean-François Fabre

Reputation: 140168

Since the separator is space, there cannot be field values containing space.

Protecting with quotes won't help either since awk doesn't consider them as protecting the columns like a csv parser could do (unless you use the FPAT trick as Ed suggested).

$ echo "$a" \"$b\" "$c" | awk '{ print "A="$1 "\nB="$2 "\nC="$3 }'
A=one
B="two
C=three"

workaround: change field separator:

$ echo "$a,$b,$c" | awk -F, '{ print "A="$1 "\nB="$2 "\nC="$3 }'
A=one
B=two three
C=four

Upvotes: 1

Ed Morton
Ed Morton

Reputation: 203502

There's a million possible answers and which one is right for you depends on what you are trying to do which you haven't told us. Here's another possibility using GNU awk for FPAT:

$ echo "\"$a\" \"$b\" \"$c\"" | awk -v FPAT='"[^"]+"' '{print "A="$1 "\nB="$2 "\nC="$3 }'
A="one"
B="two three"
C="four"

Upvotes: 1

Aaron
Aaron

Reputation: 24802

You could use awk's -v option to pass shell parameters to awk :

a="one"
b="two three"
c="four"

echo | awk -va="$a" -vb="$b" -vc="$c" '{ print "A="a "\nB="b "\nC="c }'

Upvotes: 3

Related Questions