Chinaunix首页 | 论坛 | 博客
  • 博客访问: 374928
  • 博文数量: 26
  • 博客积分: 522
  • 博客等级: 中士
  • 技术积分: 329
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-14 13:49
文章分类

全部博文(26)

文章存档

2015年(2)

2012年(7)

2011年(16)

2009年(1)

我的朋友

分类: Python/Ruby

2012-04-26 11:37:06

两者排序区别:
asort 是对数组的值进行排序,并且会丢掉原先键值;
asorti是对数组的下标进行排序。

数据文件:
12 34
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的值。


阅读(13855) | 评论(6) | 转发(2) |
给主人留下些什么吧!~~

edaplayer2019-01-14 11:29:16

goodpaperman:asorti 与 asort 唯一不同在于它排序的是数组(实际上是map)之索引,并将其赋于 b 数组。
总结一下:如果想要得到排序的结果,则必需使用 for(i=1;i<length;++i) 的形式;
因为 for(i in a) 的形式不能有序输出结果。而对于前者,如果 a 不是简单数组(map,例如 a["red"] = tiger),
则排序后 print a[i] 是无法取得值的,更无法取得索引,只能使用后一种形式,但此时输出又不是排序的;
所以 asort(a,b),然后以第一种形式遍历 b,可以得到排序后的值;
而 asorti(a,b),以第一种形式遍历 b,可以得到排序后的索引,再代入未改变的 a,则可以得到索引对应的值,
即:print i "," b[i] "," a[b[i]]

请问第一种形式和后一种形式是指什么?

回复 | 举报

edaplayer2019-01-14 10:28:52

goodpaperman:asort 的例子:“把排序后的下标存入新生成的数组b中,丢弃数组a下标值”,此处有误,
据 gawk 的 man page 所说应该是:a 数组原封未动,b数组首先拷贝自 a 数组,然后在 b 数组上排序。
例子中无法输出 a 数组的原因是,a 的索引为 12,23,78,与传入的 1,2,3 不匹配,故没有内容输出

正解

回复 | 举报

edaplayer2019-01-14 10:28:49

goodpaperman:asort 的例子:“把排序后的下标存入新生成的数组b中,丢弃数组a下标值”,此处有误,
据 gawk 的 man page 所说应该是:a 数组原封未动,b数组首先拷贝自 a 数组,然后在 b 数组上排序。
例子中无法输出 a 数组的原因是,a 的索引为 12,23,78,与传入的 1,2,3 不匹配,故没有内容输出

正解

回复 | 举报

goodpaperman2015-01-29 19:42:43

asorti 与 asort 唯一不同在于它排序的是数组(实际上是map)之索引,并将其赋于 b 数组。
总结一下:如果想要得到排序的结果,则必需使用 for(i=1;i<length;++i) 的形式;
因为 for(i in a) 的形式不能有序输出结果。而对于前者,如果 a 不是简单数组(map,例如 a["red"] = tiger),
则排序后 print a[i] 是无法取得值的,更无法取得索引,只能使用后一种形式,但此时输出又不是排序的;
所以 asort(a,b),然后以第一种形式遍历 b,可以得到排序后的值;
而 asorti(a,b),以第一种形式遍历 b,可以得到排序后的索引,再代入未改变的 a,则可以得到索引对应的值,
即:print i "," b[i] "," a[b[i]]

goodpaperman2015-01-29 19:34:48

asort 的例子:“把排序后的下标存入新生成的数组b中,丢弃数组a下标值”,此处有误,
据 gawk 的 man page 所说应该是:a 数组原封未动,b数组首先拷贝自 a 数组,然后在 b 数组上排序。
例子中无法输出 a 数组的原因是,a 的索引为 12,23,78,与传入的 1,2,3 不匹配,故没有内容输出