我试图了解两个命令之间的区别(我期待这两个命令的结果相同):
案例一
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 从不设置这个变量。它会保留你赋予它的任何价值。
NF是一个预定义变量,其值为当前记录中的字段数。每次读取记录时awk自动更新值。NF
请记住:每当 awk 读取记录/行/行时,
awk将通过字段分隔符FS(默认单个空格)解析字段,并将重新计算字段并更新变量中的相同字段NF。
因此,下面的一项不起作用。
为什么这不起作用?
NF,这是在程序执行之前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)
为什么这有效?
NF将为 5NF 情况-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)