Velvet Star Monitor

Standout celebrity highlights with iconic style.

updates

Use of `NF` in awk command

Writer Matthew Harrington

I am trying to understand what is the difference between two command (I was expecting same result from the two):

Case-I

echo 'one,two,three,four,five' |awk -v FS=, '{NF=3}1'
one two three

Case-II

echo 'one,two,three,four,five' |awk -v FS=, -v NF=3 '{$1=$1}1'
one two three four five

Here is my current understanding: $1=$1 is used to force awk to reconstruct and use the variables defined. I am assigning FS like -v FS="," which is in effect unlike -v NF=3 .

Question: Why NF=3 is not taking effect where as FS=, does.

2 Answers

:

-v var=val
--assign var=val

Set the variable var to the value val before execution of the program begins.

:

NF is a predefined variable whose value is the number of fields in the current record. awk automatically updates the value of NF each time it reads a record.

In your first program, you execute {NF=3} after each line is read, overwriting NF.

In your second program, you initially set NF=3 via -v, but that value is overwritten by awk when the first line of input is read.

FS is different because awk never sets this variable. It will keep whatever value you give it.

NF is a predefined variable whose value is the number of fields in the current record. awk automatically updates the value of NF each time it reads a record.

Remember : whenever awk reads record/line/row, awk will parse fields by field separator FS (default single space), and will recalculate fields and update the same in variable NF.

Therefore, below one does not work.

Why this doesn't work ?

  1. You defined NF, which is before the execution of the program
  2. awk read record/line/row, parsed fields, recalculated fields, so variable NF overwritten.

case - 1 :

echo 'one,two,three,four,five' |awk -v FS=, -v NF=3 '{$1=$1}1'
one two three four five

Why this works ?

  1. awk read record/line/row, parsed fields, calculated fields, NF will be 5
  2. you have overwritten variable NF

case -2 :

echo 'one,two,three,four,five' |awk -v FS=, '{ NF=3 }1'
one two three ^ Because you have overwritten variable
$ echo 'one,two,three,four,five' |awk -v FS=, '{print "Before:"NF; NF=3; print "After:"NF}1'
Before:5
After:3
one two three

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy