GNU Awk 4.2中FS =“”的行为是什么?

问题描述:

十月份的第一周,Arnold Robbins宣布gawk 4.2.0的Beta版现已发布在GNU宣布,bug-gawk和comp.lang.awk邮件列表中。它可在http://www.skeeve.com/gawk/gawk-4.1.65.tar.gz 和他提到这是一个主要版本,具有许多重要的新功能GNU Awk 4.2中FS =“”的行为是什么?

所以我通过新闻文件去钻研这些功能,并停止在这一点上做一些测试:

变化从4.1.4到4.2.0

...

  1. POSIX标准中的修订版当FS =“”时,删除POSIX 模式的特例,其中换行符不是字段分隔符。代码 和文档已更新。

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

还有就是2案件“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不存在

+0

这是好奇......宣布但没有意识到? – RomanPerekhrest

这是一个beta版本4.2,所以它内置/关闭命名为4.1。当它是官方的时候,它会是4.2.tar.gz.

我没有4.2测试版得心应手测试以下理论,但这里是我想公布关于默认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标准已经更新,包括在一组分离字符的\nFS=" "如此笨拙的人不再需要到不同的行为在POSIX与非POSIX模式方面,而是所有的POSIX awks需要更新以表现为gawk一直默认的行为。

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

+0

这是一个伟大的!我用一些'RS'完成了我的初始测试,但最后我认为它不需要参与。 – fedorqui

+1

但是,再次感谢您为此发光! – fedorqui

+0

不客气。你是否在我的答案中检验了理论,这是发行说明的含义? –