我正在阅读GNU Awk 用户指南 → 7.5.2 传达信息的内置PROCINFO变量中的内置变量的定义:
程序信息#
该数组的元素提供对有关正在运行的 awk 程序的信息的访问。以下元素(按字母顺序列出)保证可用:
PROCINFO["FS"]这是
"FS"如果字段拆分FS有效,"FIELDWIDTHS"字段拆分FIELDWIDTHS有效,"FPAT"字段匹配FPAT有效,或者"API"字段拆分由 API 输入解析器控制。
是的,它运作良好。当我提供字符串“hello;you”并按顺序设置FS为“;”、FIELDWIDTHS“2 2”和FPAT三个字符时,请参阅此示例:
$ gawk 'BEGIN{FS=";"}{print PROCINFO["FS"]; print $1}' <<< "hello;you"
FS
hello
$ gawk 'BEGIN{FIELDWIDTHS="2 2 2"}{print PROCINFO["FS"]; print $1}' <<< "hello;you"
FIELDWIDTHS
he
$ gawk 'BEGIN{FPAT="..."}{print PROCINFO["FS"]; print $1}' <<< "hello;you"
FPAT
hel
这很好,效果很好。
他们在4.8 Checking How gawk Is Splitting Records中提到之前的一点:
为了判断哪种类型的字段拆分有效,请使用
PROCINFO["FS"](请参阅传递信息的内置变量部分)。该值是"FS"如果正在使用常规字段拆分,是否正在使用"FIELDWIDTHS"固定宽度的字段拆分,或者"FPAT"是否正在使用基于内容的字段拆分。
而且在更改 FS 不影响字段中,他们描述了更改如何影响下一条记录:
根据 POSIX 标准,awk 应该表现得好像每条记录在读取时都被拆分为字段。特别是,这意味着如果您在
FS读取记录后更改 的值,则字段的值(即,它们是如何拆分的)应该反映 的旧值FS,而不是新值。
这个案例很好的解释了:
$ gawk 'BEGIN{FS=";"} {FS="|"; print $1}' <<< "hello;you
bye|everyone"
hello # "hello;you" is splitted using FS=";", the assignment FS="|" doesn't affect it yet
bye # "bye|everyone" is splitted using FS="|"
考虑到所有这些,我认为这PROCINFO["FS"]将始终反映"FS"为正在打印的记录中的字段拆分。
但是,请参阅此案例:
$ gawk 'BEGIN{FPAT="..."}{FS=";"; print PROCINFO["FS"]; print $1}' <<< "hello;you"
FS
hel
PROCINFO["FS"]显示当前记录 (FS) 中设置的信息,而不是 Awk 在处理数据时考虑的信息(即 FPAT)。如果我们交换分配,也会发生同样的情况:
$ gawk 'BEGIN{FS=";"}{FPAT="..."; print PROCINFO["FS"]; print $1}' <<< "hello;you"
FPAT
hello
为什么PROCINFO["FS"]显示的 FS 与打印它的记录中使用的 FS 不同?