免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3031 | 回复: 15

[系统管理] 不是很理解asorti函数的使用原理 [复制链接]

论坛徽章:
0
发表于 2012-08-20 09:56 |显示全部楼层
  1. [root@a ~]# cat b.txt
  2. 12 34 2
  3. 78 90 1
  4. 78 90 3
  5. 12 45 5
  6. 23 45 4
  7. [root@a ~]# awk '{a[$3]=$0}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print a[b[i]]}' b.txt
  8. 78 90 1
  9. 12 34 2
  10. 78 90 3
  11. 23 45 4
  12. 12 45 5
  13. [root@a ~]#
复制代码
我对上面这种情况只知道是这样写,但不是很清楚asorti函数的具体实现原理,哪位大牛能针对上面这个例子分步的方式直观的解释一下这个函数的实现原理,谢谢。

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2012-08-20 10:01 |显示全部楼层
asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量slen

论坛徽章:
0
发表于 2012-08-20 10:04 |显示全部楼层
能否针对上面的例子分步解释一下,谢谢,你说的那个长度指的是???回复 2# liion631818


   

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2012-08-20 10:06 |显示全部楼层
回复 3# fengfeng919


    数组a的长度

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2012-08-20 10:09 |显示全部楼层
asorti(s [, d [, how] ])
                         Return the number of elements in the source array s.   The  behavior  is  the
                         same  as that of asort(), except that the array indices are used for sorting,
                         not the array values.  When done, the array is indexed numerically,  and  the
                         values are those of the original indices.  The original values are lost; thus
                         provide a second array if you wish to preserve the original.  The purpose  of
                         the optional string how is the same as described in asort() above.


多看看帮助文档.....

论坛徽章:
0
发表于 2012-08-20 10:20 |显示全部楼层
哎,谁能分步解释一下,我实在是理解不了,杯具了我

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
发表于 2012-08-20 10:23 |显示全部楼层
本帖最后由 liion631818 于 2012-08-20 10:23 编辑

回复 6# fengfeng919


    http://yhj1065.blog.163.com/blog/static/1980021720116185138399/

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
发表于 2012-08-20 12:07 |显示全部楼层
回复 1# fengfeng919


    这种写法是有问题的,因为awk的排序是字符串排序,而非数值排序。
  1. $ cat urfile
  2. 12 34 2
  3. 78 90 1
  4. 78 90 3
  5. 12 45 5
  6. 23 45 4
  7. 23 45 10
复制代码
  1. $ awk '{a[$3]=$0}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print a[b[i]]}' urfile
  2. 78 90 1
  3. 23 45 10
  4. 12 34 2
  5. 78 90 3
  6. 23 45 4
  7. 12 45 5
复制代码
这样的结果可能不是你所期望的。

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
发表于 2012-08-20 12:46 |显示全部楼层
黑哥说的对,如果是自己用的话.考虑升级到awk4.0,使用asorti(a,b,"@ind_num_asc")

论坛徽章:
0
发表于 2012-08-20 13:50 |显示全部楼层
本帖最后由 fengfeng919 于 2012-08-20 13:55 编辑
liion631818 发表于 2012-08-20 10:23
回复 6# fengfeng919



我去看了这个例子,请问当a数组的长度赋予变量l,这个a数组的长度具体是指什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP