awk: length() 函数无法正常工作



我在awk中使用match(string,/regex/,array)strip(string,array,/regex/),我想知道array的长度

这里长度((工作

awk 'BEGIN{a[1]="sometext";print length(a)}'
output: 1

这里它不起作用

awk 'BEGIN{
str="some text simple test";
match(str,/(test)/,a);
print "a[1]: "a[1];
print length(a)
}'
output:
a[1]: test
6

奇怪的是它增加了长度

awk 'BEGIN{
str="some text simple test";
match(str,/(test)/,a);
print "a[1]: "a[1];
print "a[2]: "a[2];
print length(a)
}'
output:
a[1]: test
a[2]: 
7

为什么 length(( 不起作用并给出奇怪的输出

大多找到了原因:但即使a[2]不存在,也无法解开,但它创造了一个新的。理想情况下,如果不存在,则不应创建变量。它的评论行

$ awk 'BEGIN{
str="some text simple test";
match(str,/simple (test)/,a);
print "a[0]: "a[0];
print "a[1]: "a[1];
print "a[2]: "a[2]; # a[2] does not exist, but its creating a new one. Ideally it should not create a variable if does not exist
print "length(a): "length(a)
k = 0
for(i in a){
print "["i"]: "a[i]
k++
}
print "length: "k
print "RLENGTH::"RLENGTH
print "RSTART::"RSTART
}'
OUTPUT:
a[0]: simple test
a[1]: test
a[2]: 
length(a): 7
[0start]: 11
[0length]: 11
[1start]: 18
[1length]: 4
[0]: simple test
[1]: test
[2]: 
length: 7
RLENGTH::11
RSTART::11

awk 的 match(( 为每个匹配的组设置 startindex 和 endindex。像往常一样,元素 #0 设置为整个模式。因此,您将获得组 0(整个字符串(的三个项目,组 1(匹配的组(包含开始、长度和值。检查此内容的输出:

gawk 'BEGIN{str="some text simple test"; match(str, /(test)/, a); for (i in a) print i":"a[i]}'
0start:18
0length:4
1start:18
1length:4
0:test
1:test

首先,wrt 这里奇怪的是它增加了长度,实际上并不奇怪,只是引用array[subscript]几乎与array[subscript]=""相同。

为什么length(( 不起作用并给出奇怪的输出,但它正在工作。高克手册 说:

match(s, r [, a])

如果提供了数组a,则a清除,然后1n的元素填充匹配的s部分r中相应的括号子表达式。a的第零个元素包含与整个正则表达式r匹配的s部分。下标a[n, "start"]a[n, "length"]在字符串中提供起始索引和 每个匹配子字符串的长度。

因此,length也算a[0,"start"]a[0,"length"]等。

最新更新