我试图理解两个命令之间有什么区别(我期待两个命令的结果相同):
案例-I
echo 'one,two,three,four,five' |awk -v FS=, '{NF=3}1'
one two three
案例-II
echo 'one,two,three,four,five' |awk -v FS=, -v NF=3 '{$1=$1}1'
one two three four five
这是我目前的理解:
$1=$1
用于强制awk重建和使用定义的变量。我正在分配FS
之类的-v FS=","
,这与-v NF=3
不同。
问题:为什么NF=3
没有生效FS=,
。
答案 0 :(得分:3)
https://www.gnu.org/software/gawk/manual/gawk.html#Options:
-v var = val
- 分配 var = val在程序开始执行之前,将变量 var 设置为值 val 。
https://www.gnu.org/software/gawk/manual/gawk.html#Fields:
s3.getObject(_params, function(err, data) { if (err) { res.writeHead(500, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify({ responseMessage: 'An error occured!' })); } else { console.log(data); //here I need to return response as image/jpeg } });
是一个预定义变量,其值是当前记录中的字段数。NF
每次读取记录时都会自动更新awk
的值。
在第一个程序中,在读取每一行后执行NF
,覆盖{NF=3}
。
在你的第二个程序中,你最初通过NF
设置NF=3
,但是当读取第一行输入时,awk会覆盖该值。
-v
不同,因为awk从不设置此变量。它会保留你给它的任何价值。
答案 1 :(得分:2)
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
为什么会这样?
NF
将为5 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
答案 2 :(得分:0)
我可以说这是因为NF
在第二种情况下被称为awk
中的变量,因此无法通过执行$1=$1
来重新调整它的大小。
您可以尝试以下操作,如果您想从变量中获取字段,它应该可以使用。
echo 'one,two,three,four,five' |awk -v FS=, -v nf=3 '{NF=nf;}1'