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的值。

浙公网安备 33010602011771号