在awk中删除数组元素时发生了什么?

时间:2015-09-01 03:39:28

标签: awk

我写了以下代码:

awk -F"\t" '{
    a[1]=1; a[2]=2; a[3]=3; a[4]=4; a[5]=5; 
    delete a[4]; 
    print "len", length(a); 
    for( i =1; i<=length(a); i++) 
        print i"\t"a[i] 

    for( i in a) 
        print i"\t"a[i]
}' -

输出是:

len 4
1   1
2   2
3   3
4   
5   5
4   
5   5
1   1
2   2
3   3

我的问题是因为我删除了第4个元素,并且数组a的长度变为4,所以为什么还有5个元素,当我打印数组时,第4个元素的值变为空白?这是否表明'删除'只删除了值,相应的索引仍然存在?

1 个答案:

答案 0 :(得分:6)

删除中间for循环,您将看到发生了什么:

$ echo x | awk -F"\t" '{
    a[1]=1; a[2]=2; a[3]=3; a[4]=4; a[5]=5; 
    delete a[4]; 
    print "len", length(a); 
    for( i in a) 
        print i"\t"a[i]
}'

len 4
2   2
3   3
5   5
1   1

删除工作正如您所期望的那样,删除索引为4的数组元素,留下4个带索引1,2,3和5的元素。(即使您使用的是数字索引,它仍然是一个关联数组和旧的a[5] 现在可以a[4]访问---它仍然是a[5]。)

您在示例中看到五个元素的原因是中间for循环:

for( i =1; i<=length(a); i++) 
    print i"\t"a[i] 

只需在上面的print语句中引用a[4],就可以重新创建a数组的元素,该索引的值为空值。