1

设置 awk 的字段分隔符有几种不同的方法。这些包括

  • 命令行选项-F:例如awk -F '\t' '{…}' a.txt
  • FS在脚本开头设置变量:例如awk 'BEGIN {FS="\t"} {…} a.txt
  • 使用选项设置FS变量-v:例如awk -v 'FS=\t' '{…}' a.txt

但是,我经常使用以下内容:(awk '{…}' FS='\t' a.txt我喜欢它,因为它可以快速输入,并且还允许OFS='\t'使用类似的格式。)

我注意到如果最后两项颠倒,则不会设置字段分隔符。IEawk '{…}' a.txt FS='\t'

这个语法到底是什么意思?因此,为什么最后两项的顺序如此重要?

4

2 回答 2

2

awk按顺序处理其参数。考虑:

awk 'BEGIN{ print "BEGIN:", a } 
  { print FILENAME":", a }
  END { print "END:", a }
' file1 a=foo file2 a=bar

在此示例中,awk首先解析脚本并在读取其参数之前执行 BEGIN 块。然后它处理file1,然后进行变量赋值a=foo,然后处理file2,然后进行变量赋值a=bar,最后处理END块。

awk传递给(假设没有标志)的第一个参数(将“参数”松散地定义为不是标志的命令行元素-f)是要执行的脚本。包含等号的脚本后面的参数是变量赋值,在任何 BEGIN 块之后和为赋值之后列出的文件处理输入行之前进行。不包含等号的参数是要处理的文件。所以:

awk '{...}' a.txt FS='\t'

不起作用,因为参数FS='\t'是在 a.txt处理后进行的变量赋值。由于分配后没有列出任何文件,因此它与处理无关。

于 2013-11-04T06:27:21.917 回答
0

最后输入awk需要是文件。这就是为什么:

awk '{…}' a.txt FS='\t'  # this does not work


awk '{…}' FS='\t' a.txt  # this is OK


cat a.txt | awk '{…}' FS='\t'  # this is OK too


awk '{…}' FS='\t' a.txt  b.txt c.txt   # multiple file input OK 
于 2013-11-04T05:48:55.807 回答