awk 数组 排序

awk作为一门脚本语言,支持的数据类型主要是简单变量和数组 变量。awk中的数组与传统的C和java中的数组不同,更类似于C++ STL中的map或python中的dict,是关联式数组,通过关联关系将key和value结合起来。并且它并不限制key和value的类型,可以 在一个数组中混合使用多种类型的key和value(尽管可能不常这么用)。awk中的变量在使用之前是不需要声明的,在第一次使用时确定它的类型,并且 以后不再改变。所以如果一个变量arr第一次被当做数组来使用,那么以后就不能在用作简单变量。假定arrary是一个数组变量,如果key不在 array中,那么arrary[key]将返回一个空串;如果key在array中,则返回对应的变量arrary[key]。awk可以通过关键字 in来判断key是否在数组中出现。并且可以通过for(key in array)的形式来遍历数组中的元素。

下面给出一个简单的例子来介绍数组的使用,假定有一个文件,各行都是类似:

uid: 1234 song: YestodayOnceMore spack: 123 ppack: 345 time: 234

现在我们需要统计歌曲为YestodayOnceMore各行中出现的spack和ppack,平均时间time,可以使用以下的脚本:

  1. BEGIN{  
  2.     arr["spack" ] = 0;  
  3.     arr["ppack" ] = 0;  
  4.     arr["time" ]    = 0;  
  5.     count = 0;  
  6. }  
  7. /$4 == "YestodayOnceMore" /{  
  8.     arr["spack" ] += strtonum($6);  
  9.     arr["ppack" ] += strtonum($8);  
  10.     arr["time" ] += strtonum($10);  
  11.     count += 1  
  12. }  
  13. END{  
  14.     for (v in arr)  
  15.     {  
  16.         print v, "=" , arr[v];  
  17.     }  
  18.     if (count > 0)  
  19.         print "average time = " , arr[ "time" ]/count;  
  20.     else   
  21.         print "average time = 0" ;  
  22. }  


awk中数组的排序问题

awk中的数组是关联式的,因此在使用for(key in array)的方式进行遍历的时候,输出的顺序并不是按照key进行排序输出的,因为awk中的数组内部采用hash的方式实现,因此输出的顺序能是不确 定的。当需要按照某种顺序输出元素时,需要使用到asort和asorti函数来辅助。

asort的原型为:

asort(array1[, arrary[2]])

asort是将数组的value值进行排序,并且返回数组中元素的个数。如果采用asort(array)这种简略方式,那么重排之后的数据将会保 存在array中,但是关联关系将会被取消,下面是一个简单的例子:

  1. "wang"   =>  15           1  => 33  
  2. "lim"    =>  14           2  => 19  
  3. "zhuang" =>  19   asort() ->   3  => 15            
  4. "han"    =>  334          4  => 14  
  5. "feng"   =>  11           5  => 11  

排序结束之后,原先的关联关系被取消,取而代之的是index与value的对应关系。

如果需要对key进行排序,那么可以使用asorti函数,该函数的原型为:

asorti(array1[, array2])

asorti将数组的key值进行排序,并返回数组中元素的个数。与asort类似,如果使用asorti(array)这种简略的方式,那么排序后的key值成为value值,原先的关联关系被破坏。下面是一个简单的例子:

  1. "wang"   =>  15                 1  => feng  
  2. "lim"    =>  14                 2  => han  
  3. "zhuang" =>  19    asort() ->   3  => lim           
  4. "han"    =>  33                 4  => wang  
  5. "feng"   =>  11                 5  => zhuang  

 

如过想要保留原先的关联关系,则可以使用asorti(array1, array2)这种形式,排序后的key被保存在array2数组中。

假定有如下的问题:有一个文件包含了一组人员的信息,格式的类型为:

  1. Name     Age    Height  Weight   
  2. wanger   18    173      74  
  3. liusan   20    177      80  
  4. zhaojun  24    167      49  
  5. tianjing 30 179 75  
  6. haobo    28 171 65  

我们想要按照其中的某一项(比如身高)进行排序,当然是用sort工具就可以实现,现在我们使用awk来实现。下面是按照身高对所有的条目进行排序的代码:

  1. {  
  2.     arrary[$2] = $0  
  3. }  
  4. END{  
  5.     asorti(arrary, height);  
  6.     for (h in height)  
  7.     {  
  8.         print arrary[height[h]];  
  9.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值