当使用通过命令行传递并FS=":"在脚本中使用的字段分隔符时,我无法理解awk的行为差异.
我认为使用-F提供字段分隔符和FS在awk中使用变量是相同的事情.
但如果我这样做:
awk -F: '{}' /etc/passwd
由于空动作({}),它没有按预期打印任何内容.而且,如果我加上一个脚本:
#!/usr/bin/awk -f
{}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,没有行输出到输出.
现在,如果我将字段分隔符放在脚本中,如:
#!/usr/bin/awk -f
FS=":";
{}
Run Code Online (Sandbox Code Playgroud)
它再次打印所有行!
所以,我想在脚本中禁止默认的打印操作,因为我将在操作中进行一些计算,然后在一个END部分中打印结果.如果不首先打印所有行,我该怎么办呢?
Run Code Online (Sandbox Code Playgroud)FS=":";
这条线不符合你的想法.这不是一个指令.Awk不像大多数解释语言一样工作:文件不是指令列表.在顶层,您有表单的项目,其中条件是表达式,该操作是包含语句(指令)的大括号分隔的块.对满足条件的每条记录(行)执行操作.条件和操作都是可选的.CONDITION ACTION
赋值是一个表达式,表达式也是如此FS=":",并且没有相应的操作.省略该操作时,默认为"打印当前记录".至于{}下一行,它是一个什么都不做的动作,没有条件(意思是"总是"); 什么都不写也有同样的效果.
要在脚本启动时执行代码,您需要一个BEGIN块.您可以将其BEGIN视为在读取任何输入之前在脚本开头匹配一次的特殊条件.
BEGIN {FS = ":"}
Run Code Online (Sandbox Code Playgroud)