免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5225 | 回复: 6
打印 上一主题 下一主题

awk sort排序,谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-22 19:46 |只看该作者 |倒序浏览

请问下个为,在awk脚本中,能用sort給数组排序么?如下:数组
n--mores[n]
Elizabeth Stachelin--(916) 440-1763
Tom Savage--(40 926-3456
Archie McNichol--(206) 548-1348
Dan Savage--(406) 298-7744
John Goldenrod--(916) 348-4278
Guy Quigley--(916) 343-6410
Mike Harrington--(510) 548-1278
例:more[Elizabeth Stachelin]=(916) 440-1763  现在需要以n的下标的第二个字段排序,用sort能作么?谢谢!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2008-04-22 22:28 |只看该作者
what do you want to do?

论坛徽章:
0
3 [报告]
发表于 2008-04-23 00:19 |只看该作者
make me a big head ,and i don't understand you means.
pass by

论坛徽章:
0
4 [报告]
发表于 2008-04-23 14:37 |只看该作者
awk本身的数组使用for(x in y)模式输出时,本来就是无序的,任何时候的运行都有可能不同。

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2008-04-23 15:07 |只看该作者
如果用gawk语法上是可以的,但不知道这样作有什么实用价值


  1. [waker@proxy ~]$ cat 1.txt
  2. Elizabeth Stachelin--(916) 440-1763
  3. Tom Savage--(408) 926-3456
  4. Archie McNichol--(206) 548-1348
  5. Dan Savage--(406) 298-7744
  6. John Goldenrod--(916) 348-4278
  7. Guy Quigley--(916) 343-6410
  8. Mike Harrington--(510) 548-1278
  9. [waker@proxy ~]$ awk -F'--' '{more[$1]=$2}
  10. END {print "\n=========b4 sort=======\n"
  11. cmd="sort -k2,2"
  12. for(i in more) {print i,more[i];print i,more[i]|&cmd}
  13. print "\n=======after sort=======\n"
  14. close(cmd,"to")
  15. while ((cmd|&getline var) >0 ) {print var}
  16. close(cmd,"from")}' 1.txt

  17. =========b4 sort=======

  18. Tom Savage (408) 926-3456
  19. Elizabeth Stachelin (916) 440-1763
  20. Archie McNichol (206) 548-1348
  21. Dan Savage (406) 298-7744
  22. John Goldenrod (916) 348-4278
  23. Guy Quigley (916) 343-6410
  24. Mike Harrington (510) 548-1278

  25. =======after sort=======

  26. John Goldenrod (916) 348-4278
  27. Mike Harrington (510) 548-1278
  28. Archie McNichol (206) 548-1348
  29. Guy Quigley (916) 343-6410
  30. Dan Savage (406) 298-7744
  31. Tom Savage (408) 926-3456
  32. Elizabeth Stachelin (916) 440-1763
  33. [waker@proxy ~]$
复制代码

论坛徽章:
0
6 [报告]
发表于 2008-04-24 12:35 |只看该作者

不知道这次我描述明白没?请指教。

多谢各位热心高手,这个是我在看《unix shell范例精解4》的时候遇到的一个例子,也没什么实用价值,就拿来研究下。
其源文件是:
Mike Harrington510) 548-1278:250:100:175
Christian Dobbins40 538-2358:155:90:201
Susan Dalsass206) 654-6279:250:60:50
Archie McNichol206) 548-1348:250:100:175
Jody Savage206) 548-1278:15:188:150
Guy Quigley916) 343-6410:250:100:175
Dan Savage406) 298-7744:450:300:275
Nancy McNeil206) 548-1278:250:80:75
John Goldenrod916) 348-4278:250:100:175
Chet Main510) 548-5258:50:95:135
Tom Savage:(40 926-3456:250:168:200
Elizabeth Stachelin:(916) 440-1763:175:75:300
以下是我脚本:
#!bash
BEGIN{FS=":" ;max=0
print "                        ***FIRST QUARTERLY REPORT***"
print "                      ***CAMPAIGN 2004 CONTRIBUTIONS***";
print "-------------------------------------------------------------------------------";
printf("%-20s%-20s  %-5s|  %-5s|  %-5s|  %s\n","NAME","HONE","Jan","Feb","Mar","Total Donated";
print "-------------------------------------------------------------------------------";
}
{Donatedtotal=$3+$4+$5;
printf("%-20s%-20s  %-6.2f  %-6.2f  %-6.2f  %-6.2f\n",$1,$2,$3,$4,$5,Donatedtotal);
totals+=Donatedtotal;
if(max<Donatedtotal){max=Donatedtotal;maxname=$1};
if(Donatedtotal>500){mores[$1]=$2}
}
END{
printf("1,$%7.2f\n",totals);
printf("2,$%7.2f by %s\n",max,maxname);
print "over 500:";
for(n in mores)
printf("%s--%s\n",n,mores[n])
}
以下是输出结果:
                        ***FIRST QUARTERLY REPORT***
                      ***CAMPAIGN 2004 CONTRIBUTIONS***
-------------------------------------------------------------------------------
NAME                PHONE                 Jan  |  Feb  |  Mar  |  Total Donated
-------------------------------------------------------------------------------
Mike Harrington     (510) 548-1278        250.00  100.00  175.00  525.00
Christian Dobbins   (40 538-2358        155.00  90.00   201.00  446.00
Susan Dalsass       (206) 654-6279        250.00  60.00   50.00   360.00
Archie McNichol     (206) 548-1348        250.00  100.00  175.00  525.00
Jody Savage         (206) 548-1278        15.00   188.00  150.00  353.00
Guy Quigley         (916) 343-6410        250.00  100.00  175.00  525.00
Dan Savage          (406) 298-7744        450.00  300.00  275.00  1025.00
Nancy McNeil        (206) 548-1278        250.00  80.00   75.00   405.00
John Goldenrod      (916) 348-4278        250.00  100.00  175.00  525.00
Chet Main           (510) 548-5258        50.00   95.00   135.00  280.00
Tom Savage          (40 926-3456        250.00  168.00  200.00  618.00
Elizabeth Stachelin (916) 440-1763        175.00  75.00   300.00  550.00
1,$6137.00
2,$1025.00 by Dan Savage
over 500:
Elizabeth Stachelin--(916) 440-1763
Tom Savage--(40 926-3456
Archie McNichol--(206) 548-1348
Dan Savage--(406) 298-7744
John Goldenrod--(916) 348-4278
Guy Quigley--(916) 343-6410
Mike Harrington--(510) 548-1278
对输出结果有几个要求,其他的我侥幸都满足了,只有最后一个,要通过last name对捐款额大于500的排序。谢谢各位!

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2008-04-24 13:17 |只看该作者
以你上面的输出为基础,如果它是urfile的话
sed '/^over 500/q' urfile &&
sed '1,/^over 500/d' urfile|sort -k2,2

不就行了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP