在 awk 命令中使用 `NF`

mon*_*onk 10 awk

我试图了解两个命令之间的区别(我期待这两个命令的结果相同):

案例一

echo 'one,two,three,four,five' |awk -v FS=,  '{NF=3}1'
one two three
Run Code Online (Sandbox Code Playgroud)

案例二

echo 'one,two,three,four,five' |awk -v FS=,  -v NF=3 '{$1=$1}1'
one two three four five
Run Code Online (Sandbox Code Playgroud)

这是我目前的理解: $1=$1用于强制 awk 重构并使用定义的变量。我正在分配FSlike-v FS=","这实际上与-v NF=3 .

问:为什么NF=3在那里没有生效FS=,

mel*_*ene 13

https://www.gnu.org/software/gawk/manual/gawk.html#Options

-v var = val
--assign var = val

在程序开始执行之前将变量var设置为值val

https://www.gnu.org/software/gawk/manual/gawk.html#Fields

NF是一个预定义的变量,其值为当前记录中的字段数。每次读取记录时awk自动更新 的值NF

在您的第一个程序中,您{NF=3}在读取每一行后执行,覆盖NF.

在您的第二个程序中,您最初设置NF=3via -v,但是当读取第一行输入时,该值被 awk 覆盖。

FS是不同的,因为 awk 从不设置这个变量。它会保留你赋予它的任何价值。


Aks*_*gde 9

NF是一个预定义变量,其值为当前记录中的字段数。每次读取记录时awk自动更新值。NF

请记住:每当 awk 读取记录/行/行时,awk将通过字段分隔符FS(默认单个空格)解析字段,并将重新计算字段并更新变量中的相同字段NF

因此,下面的一项不起作用。

为什么这不起作用?

  1. 您定义了NF,这是在程序执行之前
  2. awk 读取记录/行/行,解析字段,重新计算字段,因此变量 NF被覆盖。

情况1 :

echo 'one,two,three,four,five' |awk -v FS=,  -v NF=3 '{$1=$1}1'
one two three four five
Run Code Online (Sandbox Code Playgroud)

为什么这有效?

  1. awk 读取记录/行/行、解析字段、计算字段,NF将为 5
  2. 你已经覆盖了变量NF

情况-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
Run Code Online (Sandbox Code Playgroud)