你如何在GNU Awk 4.2中跳过使用FIELDWIDTHS的字符?

时间:2017-10-25 12:15:21

标签: awk gnu gawk

GNU awk 4.2 was released它包含许多有趣的功能。其中之一是:

  
      
  1. FIELDWIDTHS解析语法已得到增强,允许指定在字段开始之前要跳过的字符数。它还允许指定' *'作为最后一个字符"记录的其余部分"。使用FIELDWIDTHS进行字段拆分现在可以正确设置NF。手册中的FIELDWIDTHS文档也进行了大量重组和改进。
  2.   

我测试了*这个东西并且很好地将最后一个块捕获到$NF

# "*" catches in $NF from the 2+2+1=5th character and until the end
$ awk 'BEGIN {FIELDWIDTHS="2 2 *"} {print $NF}' <<< "1234567890"
567890

但是,我看不到如何使用该功能的第一部分,这也在GNU Awk's Users Guide → A.6 History of gawk Features → Version 4.2 of gawk introduced the following changes中描述:

  

FIELDWIDTHS已得到增强,允许在为字段指定值之前跳过字符(请参阅Splitting By Content)。

我也找不到链接部分中的示例。因此,这个功能究竟在做什么以及它是如何工作的?

1 个答案:

答案 0 :(得分:5)

GNU Awk 文档中有一个部分,其中定义了 FIELDWIDTHS ID。
该部分/段落也有一些符号可以解释新功能&#34; 在为字段分配值之前跳过字符 &#34;。

来自7.5.1 Built-in Variables That Control awk

的(突出显示)
  

FIELDWIDTHS

     

以空格分隔的列列表,告诉gawk如何使用固定的柱状边界拆分输入。从版本4.2开始,每个   字段宽度可以选择前面跟冒号分隔的值   在字段开始之前指定要跳过的字符数。   为FIELDWIDTHS分配值会覆盖FSFPAT的使用   场分裂。

实践如何:

我们想要在第一个字段之前跳过3个字符,在第二个字段之前跳过1个字符。

awk 'BEGIN {FIELDWIDTHS="3:2 1:2 *"} {print $1, $2}' <<< "1234567890"

输出:

45 78

因此3:2跳过123并设置451:2跳过6并设置78