免费注册 查看新帖 |

Chinaunix

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

数字排序问题 [复制链接]

论坛徽章:
1
摩羯座
日期:2015-01-08 14:01:55
发表于 2009-07-16 22:48 |显示全部楼层
小弟准备开始学习python,故晚上在python版转转,看到个问题,过来请教下。
文本文档如下(每行开头无空格):
2009-06-24 00:00:00,0802,0000002001,0
2009-06-24 00:00:00,1201,0000002001,0
2009-06-24 00:00:00,1452,0000002001,0
2009-06-24 00:00:00,1755,0000002001,0
2009-06-24 00:00:00,1800,0000002001,0
2009-06-25 00:00:00,0741,0000002001,0
2009-06-25 00:00:00,1202,0000002001,0
2009-06-25 00:00:00,1447,0000002001,0
2009-06-25 00:00:00,1800,0000002001,0
2009-06-26 00:00:00,0746,0000002001,0
2009-06-26 00:00:00,1200,0000002001,0
2009-06-26 00:00:00,1310,0000002001,0
2009-06-26 00:00:00,1431,0000002001,0
2009-06-26 00:00:00,1801,0000002001,0
2009-06-27 00:00:00,0803,0000002001,0
2009-06-27 00:00:00,1213,0000002001,0
2009-06-27 00:00:00,1427,0000002001,0
2009-06-27 00:00:00,1800,0000002001,0

要求经过变换后成为以下格式:
2009-06-24,0000002001,0802,1201,1452,1755,1800
2009-06-25,0000002001,0741,1202,1447,1800
2009-06-26,0000002001,0746,1200,1310,1431,1801
2009-06-27,0000002001,0803,1213,1427,1800

小弟愚昧,awk使用不熟练,一不小心成为管道之王了,求更好方法。
awk -F '[ ,]+' '{if(a[$2]==0)print $2,$(NF-1);a[$2]++;if(a[$2]>=1)print $(NF-2)}'|sed -r ':A;N;/\n\s*[0-9]{4}-[0-9]{2}-[0-9]{2}\s*/!s/\n/\t/g;tA;D'|awk 'OFS=","{$1=$1;print}'

原帖地址如下:http://bbs2.chinaunix.net/thread-1506321-1-1.html

论坛徽章:
0
发表于 2009-07-16 23:01 |显示全部楼层
$2是哪个字段?为啥要区分是否==0?

我看糊涂了

[ 本帖最后由 welcome008 于 2009-7-16 23:05 编辑 ]

论坛徽章:
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
发表于 2009-07-16 23:07 |显示全部楼层

回复 #1 可恶的 的帖子

与python有什么关系?

论坛徽章:
0
发表于 2009-07-16 23:15 |显示全部楼层
印象中好像这里之前有一个类似的排序,很像
包括格式

论坛徽章:
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
发表于 2009-07-16 23:30 |显示全部楼层
这哪是排序问题,源数据已经排序了。

论坛徽章:
0
发表于 2009-07-16 23:36 |显示全部楼层
awk -F '[ ,]+' '{print $1,$(NF-1),$(NF-2)}' filename|sort -u|awk '{a[$1]++;if(a[$1]==1) {if(NR!=1) printf "\n";printf $1" "$2" "$3;} else printf ","$3}END{print}'

取巧了一下,不过仍然用了两个管道

论坛徽章:
0
发表于 2009-07-16 23:38 |显示全部楼层

回复 #1 可恶的 的帖子

[2]cat 3
2009-06-24 00:00:00,0802,0000002001,0
2009-06-24 00:00:00,1201,0000002001,0
2009-06-24 00:00:00,1452,0000002001,0
2009-06-24 00:00:00,1755,0000002001,0
2009-06-24 00:00:00,1800,0000002001,0
2009-06-25 00:00:00,0741,0000002001,0
2009-06-25 00:00:00,1202,0000002001,0
2009-06-25 00:00:00,1447,0000002001,0
2009-06-25 00:00:00,1800,0000002001,0
2009-06-26 00:00:00,0746,0000002001,0
2009-06-26 00:00:00,1200,0000002001,0
2009-06-26 00:00:00,1310,0000002001,0
2009-06-26 00:00:00,1431,0000002001,0
2009-06-26 00:00:00,1801,0000002001,0
2009-06-27 00:00:00,0803,0000002001,0
2009-06-27 00:00:00,1213,0000002001,0
2009-06-27 00:00:00,1427,0000002001,0
2009-06-27 00:00:00,1800,0000002001,0
[2]
[2]


[2]awk -F'[ ,]'  '{a[$1]=$1","$4;;b[$1]=b[$1]","$3}END{for(i in a)print a,b}' 3
2009-06-24,0000002001 ,0802,1201,1452,1755,1800
2009-06-25,0000002001 ,0741,1202,1447,1800
2009-06-26,0000002001 ,0746,1200,1310,1431,1801
2009-06-27,0000002001 ,0803,1213,1427,1800


是这样吗?

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-01-24 06:20:00
发表于 2009-07-17 10:03 |显示全部楼层
如果文件原先没有排序的话……

  1. awk 'BEGIN{
  2.   FS="[ ,]"
  3. }
  4. {
  5.   cnt=++a[$1","$4]
  6.   b[$1","$4","cnt]=$3;
  7. }
  8. END{
  9.   for(p in a){
  10.     for(i=2;i<=a[p];i++){
  11.       for(j=i;b[p","j-1]>b[p","j];--j){
  12.         t=b[p","j]
  13.         b[p","j]=b[p","j-1]
  14.         b[p","j-1]=t
  15.       }
  16.     }
  17.     printf p",";for(k=1;k<=a[p];k++){if(k<a[p])printf b[p","k]",";else printf b[p","k]"\n"}
  18.   }
  19. }' urfile|sort
复制代码

[ 本帖最后由 Minsic 于 2009-7-17 10:07 编辑 ]

论坛徽章:
0
发表于 2009-07-17 11:20 |显示全部楼层
只看顶楼给的文本的话:

  1. awk -F"[ ,]" '!a[$1]++{print s;s=""}{s=s?s","$3:$1","$4","$3}END{print s}' URFILE
复制代码


如果没排序的话,我的想法是全都往awk数组里丢,END时候遍历一下,最后加一个sort管道。只能对整个文本进行排序的时候,sort的效率是很高的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2009-07-17 11:34 |显示全部楼层
行转列
oracle很容易搞定..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP