免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 15810 | 回复: 67

字符串排序 [复制链接]

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-06-21 13:38 |显示全部楼层
本帖最后由 Windows19 于 2017-06-21 22:58 编辑



有在shell版老师说叫我过来这看看   我也就过来了  



不限语言

原贴
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4263348&fromuid=29931773
(出处: http://bbs.chinaunix.net/)





简化描述贴
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4263390&fromuid=29931773
(出处: http://bbs.chinaunix.net/)


统计最多字符串进行重新排序

A.txt

a1
b2
1a
d3
a1a
7c
2a0
5b
c9
6b6


分2种统计类型  1种统计字母串   1种统计数字串  ,如果同时判断这2种条件类型, 可能会存在某种判断冲突  还是写统计一种类型吧,

1, 如果按字母串统计^[a-zA-Z]  其特征 a是文本内出现5次  b出现3次  c出现2次  d出现1次  所以得从多到小排序


2, 如果按数字串统计^[0-9]  其特征  1是文本内出现3次  2出现2次  6出现2次  5出现1次  9出现1次 7出现1次 3出现1次


如果按字母串统计, 出来后大概应该是这样排  

a1
1a
a1a
2a0
b2
5b
6b6
c9
7c
d3

谢谢

论坛徽章:
0
发表于 2017-06-21 15:05 |显示全部楼层
抛砖引玉
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %seen;
  5. while ( my $word = <DATA> ) {
  6.   chomp $word;
  7.   for my $char ( split("", $word) ) {
  8.       next if $char !~ /[a-zA-Z]/;
  9.       #next if $char !~ /[0-9]/;
  10.       $seen{$char}->{num}++;
  11.       push @{$seen{$char}->{word}}, $word;
  12.   }
  13. }

  14. my %print_seen;
  15. for my $char ( sort {$seen{$b}->{num} <=> $seen{$a}->{num}} keys %seen ) {
  16.     for my $word ( @{$seen{$char}->{word}}) {
  17.       next if $print_seen{$word}++;
  18.       print $word, "\n";
  19.     }
  20. }

  21. __DATA__
  22. a1
  23. b2
  24. 1a
  25. d3
  26. a1a
  27. 7c
  28. 2a0
  29. 5b
  30. c9
  31. 6b6
复制代码

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-06-21 15:46 |显示全部楼层
回复 2# quanpai

谢谢能写成定向到文件么
因文件超过百G,最好写成执行一个脚本就可以,这样可以不用嵌入文件内容

例如执行这样命令动行脚本  perl  123  A.txt  >log
这样可以直接定向到目标文件

论坛徽章:
0
发表于 2017-06-21 15:52 |显示全部楼层
回复 3# Windows19

稍作改变:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %seen;
  5. open DATA, "<", shift;

  6. while ( my $word = <DATA> ) {
  7.   chomp $word;
  8.   for my $char ( split("", $word) ) {
  9.       next if $char !~ /[a-zA-Z]/;
  10.       #next if $char !~ /[0-9]/;
  11.       $seen{$char}->{num}++;
  12.       push @{$seen{$char}->{word}}, $word;
  13.   }
  14. }

  15. my %print_seen;
  16. for my $char ( sort {$seen{$b}->{num} <=> $seen{$a}->{num}} keys %seen ) {
  17.     for my $word ( @{$seen{$char}->{word}}) {
  18.       next if $print_seen{$word}++;
  19.       print $word, "\n";
  20.     }
  21. }

  22. close DATA;
复制代码


论坛徽章:
0
发表于 2017-06-21 15:57 |显示全部楼层
回复 3# Windows19

文件超过百G的话,估计跑不出来

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-06-21 16:03 |显示全部楼层
回复 4# quanpai

Yes  非常好请能把数字串也一起判断统计么?


论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-06-21 16:19 |显示全部楼层
本帖最后由 Windows19 于 2017-06-21 16:20 编辑

回复 4# quanpai

请问 如果同时可以统计字母串和数字串  可以实现下面结果吗?  会不会存在判断冲突
a.txt
1a
1j
1y
2a0
2u
5b
6b6
7c
a1
a1a
b2
c9
d3
g2



结果大概可以这样排序

a1
1a
a1a
1y
j1
1j
2a0
g2
2u
b2
5b
6b6
7c
c9
d3


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-06-21 16:32 |显示全部楼层
回复 2# quanpai
__DATA__
a1
b2
1a
a1
d3
a1a
7c
2a0
5b
c9
6b6
对于文本内容相同,但不同行的情况如何处理?能否继续抛砖引玉?

论坛徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役纪念章
日期:2018-03-16 10:24:0515-16赛季CBA联赛之山东
日期:2017-11-10 14:32:142016科比退役纪念章
日期:2017-09-02 15:42:4715-16赛季CBA联赛之佛山
日期:2017-08-28 17:11:5515-16赛季CBA联赛之浙江
日期:2017-08-24 16:55:1715-16赛季CBA联赛之青岛
日期:2017-08-17 19:55:2415-16赛季CBA联赛之天津
日期:2017-06-29 10:34:4315-16赛季CBA联赛之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亚冠之萨济拖拉机
日期:2015-05-22 11:38:5315-16赛季CBA联赛之北京
日期:2019-08-13 17:30:53
发表于 2017-06-21 16:36 |显示全部楼层
本帖最后由 523066680 于 2017-06-21 16:41 编辑

如果文件过百G,可以考虑先遍历一次统计次数,然后再次从头遍历
逐行根据统计结果,分类导出到不同的文件,比如
sort_a.txt,
sort_b.txt
sort_c.txt
.....

这样就不用占用什么内存。都是线性地读取线性地导出。
完成这一步后可以进行合并

论坛徽章:
22
2015年亚洲杯之科威特
日期:2015-04-18 15:27:07每日论坛发贴之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之广夏
日期:2016-03-28 16:20:51程序设计版块每日发帖之星
日期:2016-04-09 06:20:00CU十四周年纪念徽章
日期:2016-05-03 09:35:1415-16赛季CBA联赛之天津
日期:2016-11-18 08:31:3115-16赛季CBA联赛之山西
日期:2016-12-07 16:29:5315-16赛季CBA联赛之八一
日期:2017-01-10 11:34:3415-16赛季CBA联赛之吉林
日期:2017-03-30 22:51:1915-16赛季CBA联赛之广夏
日期:2017-04-13 20:51:52程序设计版块每日发帖之星
日期:2016-01-27 06:20:00每日论坛发贴之星
日期:2015-12-28 06:20:00
发表于 2017-06-21 16:54 |显示全部楼层
回复 9# 523066680

4楼测试  内存全部吃光 死机了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP