user3236182
user3236182

Reputation: 43

Replacing a csv field value using awk

I have a csv file like the following example:

fieldname1: "This is field1", "id":55, fieldname2: "This is field2", "id":66

I would like to replace the fourth field from ""id":66" to ""id":72" using the awk command. I have tried it the following way but am getting a syntax error:

awk -F, '{${4}="\"id\":999";}1' OFS=, rule.txt

The error is:

awk: {${4}="\"id\":999";}1

awk: ^ syntax error

awk: {${4}="\"id\":999";}1

awk: ^ syntax error

awk: cmd. line:1: {${4}="\"id\":999";}1 awk: cmd. line:1: ^ unexpected newline or end of string

Any suggestions for correct way of doing this?

Upvotes: 1

Views: 415

Answers (1)

fedorqui
fedorqui

Reputation: 290515

You just need to say $4 instead of ${4}:

$ awk -F, '{$4="\"id\":999";}1' OFS=, file
#           ^^
fieldname1: "This is field1", "id":55, fieldname2: "This is field2","id":999

If you want to give the value via a variable, use -v value="$bash_var" as usual:

$ awk -F, -v val=999 '{$4="\"id\":" val;}1' OFS=, file
#         ^^^^^^^^^^              ^^^^^
fieldname1: "This is field1", "id":55, fieldname2: "This is field2","id":999

Note that ${ } is used in Bash to avoid confusion when using a variable $hello being confused with $hello_you when saying eg echo "$hello_you" -> in that case, you would say echo "${hello}_you" to define the scope of the name of the variable.

But in awk such thing shouldn't be necessary because you enclose the string part in double quotes:

$ awk 'BEGIN {a=23; print a"_b"}'
23_b

Upvotes: 2

Related Questions