使用NR打印和不打印时AWK的差异

时间:2019-01-19 09:21:32

标签: awk text-processing text-parsing

我是AWK初学者,并且在使用内置变量NR之后,我不了解以下内容 文字:

C:\Users\gdog1\Desktop\proj\intparser.py:42: ParserGeneratorWarning: 4 
shift/reduce conflicts
  return self.pg.build()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2018.3.3\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:/Users/gdog1/Desktop/proj/main.py", line 20, in <module>
    parser.parse(tokens).eval()
  File "C:\Python27\lib\site-packages\rply\parser.py", line 60, in parse
    self.error_handler(lookahead)
  File "C:\Users\gdog1\Desktop\proj\intparser.py", line 39, in error_handler
    raise ValueError("Ran into a %s where it wasn't expected" % 
token.gettokentype())
ValueError: Ran into a SAY where it wasn't expected  

使用

CREDITS,EXPDATE,USER,GROUPS
99,01 jun 2018,sylvain,team:::admin
52,01    dec   2018,sonia,team
52,01    dec   2018,sonia,team

因此,我期望在使用NR> 2 && NR <5时获得相同的结果。这是我得到的:

awk 'NR' file 
CREDITS,EXPDATE,USER,GROUPS
99,01 jun 2018,sylvain,team:::admin
52,01    dec   2018,sonia,team
52,01    dec   2018,sonia,team

awk '{print NR}' file 
1
2
3
4

您能告诉我,为什么在使用awk'{print NR}'文件时,最后一行为什么不显示从数字到3到4的计数?不能将一系列NR与命令print混合吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

awk 'NR>2&&NR<5' Input_file是我们要检查的条件,如果行号大于2且大于5,则执行默认操作,即打印当前行。

在您的代码awk '{print NR>2&&NR<5}' Input_file中,您在这里使用打印,然后提及条件,而不是awk的工作方式。

awk适用于以下方法:

Condition_check/regexp{action}

如果不执行任何操作,则默认情况下将打印当前行,这是在您的第一个代码中发生的。

更多分析: 为证明点{print NR>2&&NR<5}的行为不像awk的{​​{1}}的默认方法,请运行以下命令:

regexp/condition_check{action}

查看输出将提供的内容:

awk '{print (NR>2&&NR<5)}' Input_file

请参见第3行和第4行,即0 0 1 1 0 0 0 0 0 0 表示该行的条件为TRUE,而1表示该行的条件为FALSE。因此,如果像上面提到的那样在0中使用条件,我们可以看到它在print语句中打印条件的STATE。