awk 中的asort、asorti排序数组使用及区别

        对awk而言,数组是它一个亮点。如何遍历数组呢? 采用for(i in a)是最有效的,也是我们最喜欢用的;但问题是打印出来不是排序的。今天我们学习函数asort,asorti函数可   以解决我们的困扰!

  • 两者排序区别:

asort(a [,b]) 是对数组的值进行排序,并且会丢掉原先键值;返回数组元素的个数。
asorti(a,b)   是对数组的下标进行排序;返回数组元素的个数。

数据文件data内容:

1 1 20
2 25 45
3 20 94
4 60 30
  •        awk是关联数组。for…in循环输出时候,默认打印出来是无序数组,也是随机的。
[li0924@localhost awk]$ awk '{a[$1]=$2}END{for(i in a) print i,a[i]}' data
60 30
1 20
20 94
25 45
  •  asort排序输出
[li0924@localhost awk]$ awk '{a[$1]=$2}END{for(i=1;i<=asort(a,b);i++) print i"\t"b[i]}' data
1  20
2  30
3  45
4  94

       【解析】在最后执行命令,END中 asort对数组a的值进行排序,把排序后的下标存入新生成的数组b中,丢弃数组a下标值,但此时数组a并非是空数组,a[1]还是20。

b[1]=20
b[2]=30
b[3]=45
b[4]=94

数组的值是无法直接print(输出)的,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值

  • asorti 排序输出
[li0924@localhost awk]$ awk '{a[$1]=$2}END{l=asorti(a,b);for(i=1;i<=l;i++) print i"\t"b[i]"\t"a[b[i]]}' data
1  1  20
2  20   94
3  25   45
4  60   30

【解析】在最后执行命令,END中 asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。
b[1]=1
b[2]=20
b[3]=25
b[4]=60

数组的值是无法直接print(输出)的,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值,再把数组b的值当作数组a的下标值打印数组a的值。

posted @ 2013-11-25 21:58  lottu  阅读(2526)  评论(0)    收藏  举报