Reputation: 2115
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.
Upvotes: 22
Views: 111822
Reputation: 16997
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 separatorFS
(default single space), and will recalculate fields and update the same in variableNF
.
Therefore, below one does not work.
Why this doesn't work ?
NF
, which is before the execution of the program 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 ?
NF
will be 5NF
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
Upvotes: 10
Reputation: 85837
https://www.gnu.org/software/gawk/manual/gawk.html#Options:
-v var=val
--assign var=valSet the variable var to the value val before execution of the program begins.
https://www.gnu.org/software/gawk/manual/gawk.html#Fields:
NF
is a predefined variable whose value is the number of fields in the current record.awk
automatically updates the value ofNF
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.
Upvotes: 27