免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: marksman201
打印 上一主题 下一主题

shell排序 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
41 [报告]
发表于 2010-09-28 17:03 |只看该作者
办法想出一个,但是shell的运算我彻底晕菜,php用惯了,不带这样的。。。
熟手给看看语法,老是出错误
  1. #!/bin/bash
  2. while read line
  3. do
  4. echo $line
  5. strs=`echo $line|sed 's/ /\n/g'|sort -t : -k2`
  6. #echo $strs
  7. j=0
  8. k=0
  9. #echo `echo $strs|sed 's/[a-z]://g'`
  10. for i in `echo $strs|sed 's/[a-z]://g'`
  11. do
  12. #echo $i
  13. #echo $j+$i|bc
  14. ((j=j+i))
  15. ((k=k+1))
  16. [ $j -gt 0.5 ]&&echo $j&&echo $strs|cut -f $k -d" "&&break
  17. done
  18. done<lines
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
42 [报告]
发表于 2010-09-28 17:08 |只看该作者
本帖最后由 expert1 于 2010-09-28 17:20 编辑

回复 38# 好看的附件

呵呵,

论坛徽章:
0
43 [报告]
发表于 2010-09-28 17:16 |只看该作者
回复 38# 好看的附件
  1. [root@localhost pub]# cat data
  2. a:0.13 b:0.23 c:0.05 d:0.45 e:0.07
  3. p:0.13 q:0.20 r:0.13 s:0.33 t:0.23
  4. h:0.08 g:0.11 r:0.05 y:0.45 s:0.24
  5. g:0.01 q:0.02 r:0.03 s:0.04 t:0.05
  6. g:0.21 q:0.22 r:0.03 s:0.04 t:0.05
  7. [root@localhost pub]# awk -F "[: ]+" '{for(i=1;i<NF;i+=2){a[$(i+1)":"$i]=$i":"$(i+1);b[++n]=$(i+1)":"$i};asort(b);for(z=1;z<=n;z++){sum+=b[z];if(sum>0.5){for(k=1;k<z;k++){printf a[b[k]]" "};break};if(z==n){for(k=1;k<=n;k++){printf a[b[k]]" "}}};delete a;delete b;n=sum=0;printf "\n"}' data
  8. c:0.05 e:0.07 a:0.13 b:0.23
  9. p:0.13 r:0.13 q:0.20
  10. r:0.05 h:0.08 g:0.11 s:0.24
  11. g:0.01 q:0.02 r:0.03 s:0.04 t:0.05
  12. r:0.03 s:0.04 t:0.05 g:0.21
  13. [root@localhost pub]#
复制代码

论坛徽章:
0
44 [报告]
发表于 2010-09-28 17:19 |只看该作者
回复 43# sunbw001


    it's ok~!

论坛徽章:
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
45 [报告]
发表于 2010-09-28 17:20 |只看该作者
本帖最后由 blackold 于 2010-09-28 17:21 编辑
  1. awk '{s=0;for(i=1;i<=NF;i++){t=$i;sub(/.*:/,"",t);a[t]=$i;b[t]};asorti(b);for(i=1;i<=NF;i++){s+=b[i];if(s<0.5)printf a[b[i]]" "}print "";delete a}' urfile
复制代码

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
46 [报告]
发表于 2010-09-28 17:23 |只看该作者
回复 45# blackold


    asorti咋用的呀?、

论坛徽章:
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
47 [报告]
发表于 2010-09-28 17:27 |只看该作者
本帖最后由 blackold 于 2010-09-28 17:52 编辑

回复 46# expert1


    index排序。GNU extension

不过这种方法还是不好,如果相等就只保留一个。


更正:我说错了,这不是sort的问题。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
48 [报告]
发表于 2010-09-28 17:29 |只看该作者
回复 47# blackold


    那还是有bug。

论坛徽章:
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
49 [报告]
发表于 2010-09-28 17:36 |只看该作者
本帖最后由 blackold 于 2010-09-28 17:52 编辑

回复 48# expert1


    是的。awk的sort函数是有这个问题。

更正:这不是sort本身的问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
50 [报告]
发表于 2010-09-28 17:37 |只看该作者
这个可以了
  1. #!/bin/bash
  2. while read line
  3. do
  4. strs=`echo $line|sed 's/ /\n/g'|sort -t : -k2`
  5. j=0
  6. k=0
  7. for i in `echo $strs|sed 's/[a-z]://g'`
  8. do
  9. j=`echo $j+$i|bc`
  10. ((k=k+1))
  11. [ `echo "$j>0.5"|bc` -eq 1 ]&&echo $strs|cut -f -$k -d" "&&break
  12. done
  13. done<lines
复制代码
  1. ./sh006.sh
  2. c:0.05 e:0.07 a:0.13 b:0.23 d:0.45
  3. p:0.01 r:0.13 q:0.20 t:0.23
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP