转自http://blog.chinaunix.net/uid-21374062-id-3189744.html
两者排序区别:
两者排序区别:
asort 是对数组的值进行排序,并且会丢掉原先键值;
asorti是对数组的键值进行排序,生成<序号,键值>关联数组。
注1:跟c++, python等语言不同,awk中的关联数组并不按照键值进行排序,其仅仅只是保存<键值字符串,值>的映射关系。
注2:常规的排序工作,一般用sort命令即可,awk中使用排序功能相对成本较高。
注1:跟c++, python等语言不同,awk中的关联数组并不按照键值进行排序,其仅仅只是保存<键值字符串,值>的映射关系。
注2:常规的排序工作,一般用sort命令即可,awk中使用排序功能相对成本较高。
数据文件:
12 34
78 90
23 45
78 90
23 45
1. awk是关联数组。for…in循环输出时候,默认打印出来是无序数组。
[root@zhenjiang ~]# awk '{a[$1]=$2}END{for(i in a) print i,a[i]}' test
78 90
12 34
23 45
2. asort排序输出
[root@zhenjiang ~]# awk '{a[$1]=$2}END{slen=asort(a,b);for(i=1;i<=slen;i++) print i"\t"a[i]"\t"b[i]}' test
1
34
2
45
3
90
在最后执行命令,END中 asort对数组a的值进行排序,把排序后的下标存入新生成的数组b中,
丢弃数组a下标值,再把数组a的长度赋值给变量slen。
b[1]=34
b[2]=45
b[3]=90
此时a已经是空数组。
数组的值是无法直接print(输出)的,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值
3. asorti 排序输出
[root@zhenjiang ~]# awk '{a[$1]=$2}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print i"\t"b[i]"\t"a[b[i]]}' test
1
12
34
2
23
45
3
78
90
在最后执行命令,END中 asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。
b[1]=12
b[2]=23
b[3]=78
数组的值是无法直接print(输出)的
,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值,再把数组b的值当作数组a的下标值打印数组a的值。