Arrays 如何在awk多维数组中获得1个方向的数组维数

Arrays 如何在awk多维数组中获得1个方向的数组维数,arrays,awk,Arrays,Awk,在awk数组中是否有任何方法可以像在php中那样只获取一维长度 看看这个简单的例子 awk 'BEGIN{ a[1,1]=1; a[1,2]=2; a[2,1]=3; a[2,3]=2; print length(a) }' 这里数组的长度是4,其中每个字段都是一个实

awk
数组中是否有任何方法可以像在php中那样只获取一维长度

看看这个简单的例子

     awk 'BEGIN{
                   a[1,1]=1;
                   a[1,2]=2;
                   a[2,1]=3;
                   a[2,3]=2;
                   print length(a)
               }'
这里数组的长度是4,其中每个字段都是一个实体,我的兴趣是得到数组中有多少行,在我的实际代码中,我有n个字段设置数组,如下所示

             for(i=1;i<=NF;i++)A[FNR,i]=$i
           awk '
               function _get_rowlength(Arr,fnumber, i,t,c){

                for(i in Arr){ 
                               split(i,sep,SUBSEP)
                               if(!(sep[fnumber] in t))
                               {
                                   c++
                                   t[sep[fnumber]]
                               }
                             }
                    return c;
               }

               BEGIN{
                              a[1,1]=1;
                              a[1,2]=2;
                              a[2,1]=3;
                              a[2,3]=2;

                              print _get_rowlength(a,1)
                     }'

对于(i=1;i这可以通过计算数组中的唯一索引来实现,请尝试以下方法

             for(i=1;i<=NF;i++)A[FNR,i]=$i
           awk '
               function _get_rowlength(Arr,fnumber, i,t,c){

                for(i in Arr){ 
                               split(i,sep,SUBSEP)
                               if(!(sep[fnumber] in t))
                               {
                                   c++
                                   t[sep[fnumber]]
                               }
                             }
                    return c;
               }

               BEGIN{
                              a[1,1]=1;
                              a[1,2]=2;
                              a[2,1]=3;
                              a[2,3]=2;

                              print _get_rowlength(a,1)
                     }'
结果

             $ ./tester
             2

如果要在
Solaris/SunOS
系统上尝试此操作,请将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk
,这可以通过计算数组中的唯一索引来实现,请尝试以下操作

             for(i=1;i<=NF;i++)A[FNR,i]=$i
           awk '
               function _get_rowlength(Arr,fnumber, i,t,c){

                for(i in Arr){ 
                               split(i,sep,SUBSEP)
                               if(!(sep[fnumber] in t))
                               {
                                   c++
                                   t[sep[fnumber]]
                               }
                             }
                    return c;
               }

               BEGIN{
                              a[1,1]=1;
                              a[1,2]=2;
                              a[2,1]=3;
                              a[2,3]=2;

                              print _get_rowlength(a,1)
                     }'
结果

             $ ./tester
             2

如果要在
Solaris/SunOS
系统上尝试此操作,请将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk
,这可以通过计算数组中的唯一索引来实现,请尝试以下操作

             for(i=1;i<=NF;i++)A[FNR,i]=$i
           awk '
               function _get_rowlength(Arr,fnumber, i,t,c){

                for(i in Arr){ 
                               split(i,sep,SUBSEP)
                               if(!(sep[fnumber] in t))
                               {
                                   c++
                                   t[sep[fnumber]]
                               }
                             }
                    return c;
               }

               BEGIN{
                              a[1,1]=1;
                              a[1,2]=2;
                              a[2,1]=3;
                              a[2,3]=2;

                              print _get_rowlength(a,1)
                     }'
结果

             $ ./tester
             2

如果要在
Solaris/SunOS
系统上尝试此操作,请将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk
,这可以通过计算数组中的唯一索引来实现,请尝试以下操作

             for(i=1;i<=NF;i++)A[FNR,i]=$i
           awk '
               function _get_rowlength(Arr,fnumber, i,t,c){

                for(i in Arr){ 
                               split(i,sep,SUBSEP)
                               if(!(sep[fnumber] in t))
                               {
                                   c++
                                   t[sep[fnumber]]
                               }
                             }
                    return c;
               }

               BEGIN{
                              a[1,1]=1;
                              a[1,2]=2;
                              a[2,1]=3;
                              a[2,3]=2;

                              print _get_rowlength(a,1)
                     }'
结果

             $ ./tester
             2

如果要在
Solaris/SunOS
系统上尝试此操作,请将
awk
更改为
/usr/xpg4/bin/awk
/usr/xpg6/bin/awk
,或
nawk
使用GNU awk,因为它具有真正的多维数组:

awk 'BEGIN{
    a[1][1]=1;
    a[1][2]=2;
    a[1][3]=3;
    a[2][1]=4;
    a[2][2]=5;
    print length(a)
    print length(a[1])
    print length(a[2])
}'
2
3
2

使用GNU awk,因为它具有真正的多维数组:

awk 'BEGIN{
    a[1][1]=1;
    a[1][2]=2;
    a[1][3]=3;
    a[2][1]=4;
    a[2][2]=5;
    print length(a)
    print length(a[1])
    print length(a[2])
}'
2
3
2

使用GNU awk,因为它具有真正的多维数组:

awk 'BEGIN{
    a[1][1]=1;
    a[1][2]=2;
    a[1][3]=3;
    a[2][1]=4;
    a[2][2]=5;
    print length(a)
    print length(a[1])
    print length(a[2])
}'
2
3
2

使用GNU awk,因为它具有真正的多维数组:

awk 'BEGIN{
    a[1][1]=1;
    a[1][2]=2;
    a[1][3]=3;
    a[2][1]=4;
    a[2][2]=5;
    print length(a)
    print length(a[1])
    print length(a[2])
}'
2
3
2

结果不等于
END
块中的
FNR
吗?或者您正在打开多个文件吗?您可以将
NF
存储为密钥的一部分,
awk'{for(i=1;i@jaypal:无需向数组添加额外索引,因为他/她只需要行数…结果不等于
END
块中的
FNR
吗?或者您正在打开多个文件吗?您可以将
NF
存储为键的一部分,
awk'{for(i=1;i@jaypal:无需向数组添加额外索引,因为他/她只需要行数…结果不等于
END
块中的
FNR
吗?或者您正在打开多个文件吗?您可以将
NF
存储为键的一部分,
awk'{for(i=1;i@jaypal:无需向数组添加额外索引,因为他/她只需要行数…结果不等于
END
块中的
FNR
吗?或者您正在打开多个文件吗?您可以将
NF
存储为键的一部分,
awk'{for(i=1;i@jaypal:无需向数组添加额外索引,因为他/她只需要行数。。。