免费注册 查看新帖 |

Chinaunix

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

各位大大能不能给我这个统计排序的脚本 ? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-11 18:27 |只看该作者 |倒序浏览
本帖最后由 gr33n 于 2013-10-11 14:01 编辑

各位大大好:

一个字符串, 是由字符 A, B, C, D 字符组成的。如:
ABDCDCDC

1: 按照 输入值 K值 进行分割,分割成每 K个字符 一组。如:

K = 1   A B D C D C D C 共8组
K = 2   AB DC DC DC     共4组
K = 3   ABD CDC DC      共3组

2: 统计每组字符的数值:
字符的值 A = 0, B = 1, C = 2, D = 3

每组字符数值计算公式如:
DC  值 3, 2                 => (3 * 4**1) + (2 * 4**0) = 14
ABC 值 0, 1, 2 => (0 * 4**2) + (1 * 4**1) + (2 * 4**0) = 6


3: 结果按照频数由大到小排序, 如:

字符串: ABDCDCDC
K = 2, 共4组字符, AB DC DC DC 输出为:
字符组  频数  每组字符的数值



DC  3   14
AB  1   1


各位大大能不能给我这个统计排序的脚本 ?

字符串: ABDCDCDCAABBCDCCABBB
K值: 输入
输出为: ?

论坛徽章:
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
2 [报告]
发表于 2013-10-12 10:29 |只看该作者
本帖最后由 ly5066113 于 2013-10-12 10:43 编辑

回复 1# gr33n


试试:
  1. use strict;
  2. use warnings;

  3. my $str = shift;
  4. my $k = shift;
  5. my %v = (
  6.         "A" => 0,
  7.         "B" => 1,
  8.         "C" => 2,
  9.         "D" => 3,
  10. );
  11. my %h;

  12. for ( my $i = 0; $i <= ( length($str) - 1 ); $i += $k )
  13. {
  14.         $h{substr($str, $i, $k)} ++;
  15. }

  16. foreach ( sort { $h{$b} <=> $h{$a} or $a cmp $b } keys %h )
  17. {
  18.         my $value = 0;
  19.         for my $i ( 0 .. ( length($_) - 1 ) )
  20.         {
  21.                 $value += $v{substr($_, $i, 1)} * 4 ** ( length($_) - $i - 1 );
  22.         }
  23.         print "$_\t$h{$_}\t$value\n";
  24. }
复制代码
$ perl test.pl ABDCDCDCAABBCDCCABBB 2
DC      3       14
AB      2       1
BB      2       5
AA      1       0
CC      1       10
CD      1       11
$ perl test.pl ABDCDCDCAABBCDCCABBB 3
CDC     2       46
ABB     1       5
ABD     1       7
BB      1       5
CAB     1       33
DCA     1       56

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
3 [报告]
发表于 2013-10-12 11:56 |只看该作者
回复 1# gr33n
  1. use strict;
  2. use warnings;
  3. my $str  = 'ABDCDCDCAABBCDCCABBB';
  4. my $k    = 2;
  5. my @line = unpack "A$k" x ( length($str) ), $str;
  6. my $h;
  7. my $l = {
  8.     "A" => 0,
  9.     "B" => 1,
  10.     "C" => 2,
  11.     "D" => 3,
  12. };
  13. for (@line) {
  14.     next unless $_;
  15.     $h->{$_}++;
  16. }

  17. for my $m (  keys $h ) {
  18.     my $sum;
  19.     my @data = split //, $m;
  20.     for ( 0 .. ( length($m) - 1 ) ) {
  21.         $sum += ( $l->{ pop @data } * 4**$_ );
  22.     }
  23.     print "$m\t$h->{$m}\t$sum\n";
  24. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-10-13 16:23 |只看该作者
好厉害!谢谢2位大大了。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
5 [报告]
发表于 2013-10-17 06:23 |只看该作者
ru:
  1. #!/usr/bin/perl
  2. my $S = 'ABDCDCDCAABBCDCABBCB';
  3. my %V = qw[A 0 B 1 C 2 D 3];
  4. my $K = do { print 'k = '; 0 + <> };
  5. my %S ; map $S{$_}++, map /(.{$K}|.+)/g, $S;

  6. print map {
  7.     my ( @C, $v ) = split //;
  8.     map $v += $V{ shift @C } * 4**@C, @C;
  9.     join( "\t", $_, $S{$_}, $v ) . $/
  10. } sort { $S{$b} <=> $S{$a} } keys %S;
复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2013-10-28 09:27 |只看该作者
本帖最后由 rdcwayx 于 2013-10-28 11:28 编辑

by shell
  1. $ cat gr33n.sh

  2. #! /usr/bin/bash

  3. str=$1
  4. key=$2

  5. echo $str $key|awk 'BEGIN{c["A"]=0;c["B"]=1;c["C"]=2;c["D"]=3}
  6. {  l=split($1,a,"")
  7.    for (i=1;i<=l;i=i+$2)
  8.      { s="";v=0
  9.        for (j=0;j<$2;j++) s=s a[i+j]
  10.        d[s]++
  11.        m=split(s,b,"")
  12.        for (k=1;k<=m;k++) v+=c[b[k]]*4**(m-k)
  13.        e[s]=v
  14.      }
  15. }
  16. END {for (i in d) print i,d[i],e[i]}' |sort -k2nr
复制代码
  1. $ ./gr33n.sh  ABDCDCDCAABBCDCCABBB 3
  2. CDC 2 46
  3. ABB 1 5
  4. ABD 1 7
  5. BB 1 5
  6. CAB 1 33
  7. DCA 1 56
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP