FS ="的行为是什么? "在GNU Awk 4.2中?

时间:2017-10-06 15:22:51

标签: awk posix gnu gawk

10月的第一周,Arnold Robbins在GNU-announce,bug-gawk和comp.lang.awk邮件列表中宣布了 Beta版本的gawk 4.2.0现已发布。它可以在http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz 1 中找到,他提到这是一个主要版本,有许多重要的新功能

所以我浏览了NEWS文件以深入研究这些功能,并在此时停止进行一些测试:

  

从4.1.4变为4.2.0

     

...

     
      
  1. POSIX标准中的修订删除了POSIX的特殊情况   FS =&#34时的模式; "其中换行不是字段分隔符。代码   和doc已经更新。
  2.   

如果我理解得当,他会谈到GNU Awk User's Guide → 4.5.2 Using Regular Expressions to Separate Fields

  

'FS ="两个案例之间存在重要差异。 "'(单个空格)和'FS =" [\ t \ n] +"'(匹配一个或多个空格,TAB或换行符的正则表达式)。对于FS的两个值,字段由空格,TAB和/或换行符的运行(多个相邻出现)分隔。但是,当FS的值为" ",awk首先从记录中删除前导和尾随空格,然后决定字段的位置。

即使用FS = " "FS = "[ \t\n]+"之间的差异。

我运行了新版本并使用--posix模式运行了测试:

$ ./gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are
you"
NR: 1
1 hello
2 how
3 are
NR: 2
1 you

与我之前的awk(4.1.3)相比,看不出任何差异:

$ gawk --posix -F" " '{print "NR:", NR; for(i=1;i<=NF;i++) print i, $i}' <<< "hello how are
you"
NR: 1
1 hello
2 how
3 are
NR: 2
1 you

总而言之,我的问题是: GNU Awk 4.2的FS = " "模式--posix的行为有何不同?究竟有哪些改变?

1是的,我还认为它应该是4.2.tar.gz,但http://www.skeeve.com/gawk/gawk-4.2.tar.gz不存在

1 个答案:

答案 0 :(得分:2)

它是4.2的beta测试版,所以它的构建/命名为4.1。当它正式时,它将是4.2.tar.gz。

我没有4.2 beta方便测试以下理论,但我认为关于默认FS=" "的公告意味着:

以前在POSIX中,当您设置FS=" "时,表示字段被除了换行符之外的所有空白字符分隔。另一方面,gawk默认包含newline作为分隔符之一,你必须添加--posix来获取POSIX行为。看:

$ gawk --version
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)

$ printf 'a b\nc' | awk -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}'
1 3 1 <a>
1 3 2 <b>
1 3 3 <c>

$ printf 'a b\nc' | awk --posix -v RS='^$' 'NR==1{for (i=1; i<=NF;i++) print NR, NF, i, "<" $i ">"}'
1 2 1 <a>
1 2 2 <b
c>

显然现在POSIX标准已经更新,以便在\n时将FS=" "包含在分隔符字符集中,因此在posix与非posix模式下gawk不再需要在这方面表现不同,而是所有POSIX awks都需要更新,以便一直默认为gawk。

您问题中的示例没有测试,因为它使用\n作为RS(默认值),因此无法测试\n在记录中时会发生什么。设置RS="^$"后再试一次。