Linux高级文本处理之gawk关联数组(2)

实例2���

[root@localhost ~]# awk ' >BEGIN{item[1]="a";  >item[2]="b";item[3]="c"; >delete item;   #使用delete直接加数组名称删除全部数组 >for(x in item) print item[x];}' 四、多维数组

虽然 awk 只支持一维数组,但可以使用一维数组来模拟多维数组。

实例1:

[root@localhost ~]# cat array-multi.awk BEGIN { item["1,1"]=10; item["1,2"]=20; item["2,1"]=30; item["2,2"]=40 for (x in item) print item[x] } [root@localhost ~]# awk -f array-multi.awk 30 20 40 10

说明:即使使用了”1,1”作为索引值,它也不是两个索引,仍然是单个字符串索引,值为”1,1”。所 以item[“1,1”]=10,实际上是把 10 赋给一维数组中索引”1,1”代表的值。

实例2:将双引号去掉

[root@localhost ~]# cat array-multi2.awk BEGIN { item[1,1]=10; item[1,2]=20; item[2,1]=30; item[2,2]=40 for (x in item) print item[x] } [root@localhost ~]# awk -f array-multi2.awk 10 30 20 40

说明:上面的例子仍然可以运行,但是结果有所不同。在多维数组中,如果没有把下标用引号引住, awk 会使用”\034”作为下标分隔符。

当指定元素 item[1,2]时,它会被转换为 item[“1\0342”]。 Awk 用把两个下标用”\034”连接起 来并转换为字符串。

实例3:

[root@localhost ~]# cat 034.awk  BEGIN {     item["1,1"]=10;     item["1,2"]=20;     item[2,1]=30;     item[2,2]=40;     for(x in item)         print "Index",x,"contains",item[x]; } [root@localhost ~]# awk -f 034.awk  Index 1,2 contains 20 Index 21 contains 30 Index 22 contains 40 Index 1,1 contains 10

说明:

索引”1,1”和”1,2”放在了引号中,所以被当做一维数组索引, awk 没有使用下标分 隔符,因此,索引值被原封不动地输出。

所以 2,1 和 2,2 没有放在引号中,所以被当做多维数组索引, awk 使用下标分隔符 来处理,因此索引变成”2\0341”和”2\0342”,于是在两个下标直接输出了非打印字符 “\034”

五、SUBSEP 下标分隔符

通过变量 SUBSEP 可以把默认的下标分隔符改成任意字符。

实例1:

[root@localhost ~]# cat subsep.awk  BEGIN {     SUBSEP=":";     item["1,1"]=10;     item["1,2"]=20;     item[2,1]=30;     item[2,2]=40;     for(x in item)         print "Index",x,"contains",item[x]; } [root@localhost ~]# awk -f subsep.awk  Index 1,2 contains 20 Index 2:1 contains 30 Index 2:2 contains 40 Index 1,1 contains 10

说明:索引”1,1”和”1,2”由于放在了引号中而没有使用 SUBSEP 变量。

注意:使用多维数组时,最好不要给索引值加引号,直接使用SUBSEP变量制定索引分隔符。

六、用 asort 为数组排序

asort 函数重新为元素值排序,并且把索引重置为从 1 到 n 的值,此处 n 代表数组元素个数。

实例1:

[root@localhost ~]# cat asort.awk  BEGIN {     item[101]="HD Camcorder";     item[102]="Refrigerator";item[103]="MP3 Player";     item[104]="Tennis Racket";     item[105]="Laser Printer";     item[1001]="Tennis Ball";     item[55]="Laptop";     item["na"]="Not Available";     print "---------- Before asort -------------"     for(x in item)         print "Index",x,"contains",item[x]     total = asort(item);     print "---------- After asort -------------"     for(x in item)         print "Index",x,"contains",item[x]     print "Return value from asort:",total; } [root@localhost ~]# awk -f asort.awk  ---------- Before asort ------------- Index 55 contains Laptop Index 101 contains HD Camcorder Index 102 contains Refrigerator Index 103 contains MP3 Player Index 104 contains Tennis Racket Index 105 contains Laser Printer Index na contains Not Available Index 1001 contains Tennis Ball ---------- After asort -------------  #awk数组索引是从1开始的不是0 Index 4 contains MP3 Player Index 5 contains Not Available Index 6 contains Refrigerator Index 7 contains Tennis Ball Index 8 contains Tennis Racket Index 1 contains HD Camcorder Index 2 contains Laptop Index 3 contains Laser Printer Return value from asort: 8

注意:一旦调用 asort 函数,数组原始的索引值就不复存在了,索引并不是按照1-8排序而是随机排序。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14353.html