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

3

GNU Awk 4.2已发布,其中包含许多有趣的特性之一是:

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

我测试了*这个符号,并且它可以很好地捕捉最后一个块到$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用户指南→ A.6 gawk功能历史→ gawk版本4.2引入了以下更改中描述:

FIELDWIDTHS已得到增强,允许在将值分配给字段之前跳过字符(请参见按内容拆分)。

我在链接的部分中也没有找到示例。因此,这个功能到底是做什么的,它是如何工作的呢?

1个回答

5
GNU Awk文档有一个部分定义了FIELDWIDTHS。在这一段落中还有一些注释阐明了一个新功能,即“在为字段指定值之前跳过字符”。来自7.5.1内置控制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 并设置为 45,而 1:2 跳过 6 并设置为 78


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接