在awk命令中使用`NF`

时间:2017-11-10 06:24:13

标签: awk

我试图理解两个命令之间有什么区别(我期待两个命令的结果相同):

案例-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=,

3 个答案:

答案 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中更新相同内容。

因此,下面一个不起作用。

为什么这不起作用?

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

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

    为什么会这样?

    1. awk读取记录/行/行,已解析字段,计算字段,NF将为5
    2. 您已覆盖变量NF
    3. 案例-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'