免费注册 查看新帖 |

Chinaunix

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

用sort进行比较时 如何先匹配 $a $b 在比较 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-22 14:12 |只看该作者 |倒序浏览
班主曾经回复过一个问题  
解答比较的问题: 就是文件 如何按照第二列进行排列的问题
open(FF,”aaa.dat”) or die $!;  
print sort {(split(/<>/,$a))[4] <=> (split(/<>/,$b))[4]} <FF>;  
close(FF);

我现在想先让 (split(/<>/,$a))[4] 匹配成   =~ s/[^0-9]//g; 然后再比较  不知道要怎么写?

(我的文件中有时间列 2008年1月22日 我想先匹配成2008122 这样用sort)

[ 本帖最后由 hitsubunnu 于 2008-1-22 14:32 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-22 14:22 |只看该作者
能不能把文件贴出两行来看看

论坛徽章:
0
3 [报告]
发表于 2008-01-22 14:27 |只看该作者
文件如下   
3<>0<>test<>障害<>2008年1月22日10:56:59<><>test-3<><pre>test-3</pre>
2<>0<>test<>障害<>2008年1月22日10:56:49<><>test-2<><pre>test-2</pre>
用 sort {(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]} <FF>;  
排列光含有数字的列没有任何问题

我的程序如果改成以下的形式
3<>0<>test<>障害<>2008122105659<><>test-3<><pre>test-3</pre>
2<>0<>test<>障害<>2008122105649<><>test-2<><pre>test-2</pre>
排序没有任何问题
但是我的程序需要输出时间 2008122105659 这种看着太不好了  还是想要2008年1月22日10:56:59这种输出

论坛徽章:
0
4 [报告]
发表于 2008-01-22 14:46 |只看该作者
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的

论坛徽章:
0
5 [报告]
发表于 2008-01-22 14:50 |只看该作者
原帖由 Nosferatu 于 2008-1-22 14:46 发表
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的

不好意思能 说的详细些吗   
比如怎将 2008122 变成2008年1月22日

论坛徽章:
0
6 [报告]
发表于 2008-01-22 15:55 |只看该作者
原帖由 Nosferatu 于 2008-1-22 14:46 发表
只想要清晰输出的话,可以先排序再把年月日加上去,因为日期的格式是固定的

我用 substr 进行取字符  实现了 2008122变成2008年1月22日  不过这个办法觉得太那个了吧   那位朋友能帮忙 解决一下匹配后 再比较  这里不胜感激!!!

论坛徽章:
0
7 [报告]
发表于 2008-01-22 16:04 |只看该作者
原帖由 hitsubunnu 于 2008-1-22 15:55 发表

我用 substr 进行取字符  实现了 2008122变成2008年1月22日  不过这个办法觉得太那个了吧   那位朋友能帮忙 解决一下匹配后 再比较  这里不胜感激!!!


2008122 既可以写成2008年1月22日 也可以写成2008年12月2日

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122

我不知道如何控制,呵呵

另外能不能告诉我
print sort {((split('<>',$a))[4]) =~ s/[^0-9]//g <=> ((split('<>',$b))[4])=~ s/[^0-9]//g} <FILE>;  # 这个编译不过,不知道你是怎么加进去这个s//的

论坛徽章:
0
8 [报告]
发表于 2008-01-22 16:15 |只看该作者
原帖由 CU_wanglijun 于 2008-1-22 16:04 发表


2008122 既可以写成2008年1月22日 也可以写成2008年12月2日

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122

我不知道如何控制,呵呵

另外能不能告诉我
print  ...

我觉得关键是最开始你从2008年1月22日转变成数字的时候能不能控制格式 =》 20080122
------- 这个我没写清楚  我的实际程序是按照  这个 xxxx年xx月xx日  这种格式的    文件格式问题跟我写的例子无关可以不考虑。

print sort {((split('<>',$a))[4]) =~ s/[^0-9]//g <=> ((split('<>',$b))[4])=~ s/[^0-9]//g} <FILE>;  # 这个编译不过,不知道你是怎么加进去这个s//的

--------我的问题就是 想知道 如何加进去?        

可能是我的问题没有写清楚  在此表示抱歉!

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
9 [报告]
发表于 2008-01-22 16:24 |只看该作者
这个意思?
perl -F'<>' -lane '$F[4]=~s/\D+//g;$h{$F[4]}=$_;END{print $h{$_} for(sort keys %h)}' aaa.dat

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2008-01-22 16:28 |只看该作者
写这麽复杂的代码...如果哪天你要修改的话...
你可能会累死日後的自己....

20080122可以用
my($year,$mon,$day,) = unpack("A4A2A2",$date);

如果是2008年12月12日..则可以用
my($year,$mon,$day) = $string=~/(\d+).*?(\d+).*?(\d+)/;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP