免费注册 查看新帖 |

Chinaunix

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

如何进行对其呀 [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-10-03 20:39 |只看该作者 |倒序浏览
本帖最后由 sunzhiguolu 于 2016-10-03 20:40 编辑

在 shell 板块看到一篇帖子, 内容如下:
例如以下  手工做出了每行前3位各列统计数据  标注颜色是要统计每列数据

|dTs8
N6ds85|\4sawd4  1/                     #遇到空格也要统计上
Qds5|\4s
Nds85|\4sawd41/*[]df~9D EF+VF-V_S             #遇到空格也要统计上
|sd
NNUs85|

#统计每列各字符次数 应从多到少排列 有多少位就统计到多少位,但最好能随意设1个限定
统计到多少位数字   统计准确效率也是关键
手工做出了示例 每行 前3位 各列 统计数据  
出来效果
3次 N       3次 d     2次 d    第4列    第5列     第6列 ...  #这样一直下去
2次 |        1次 N     2次 s
1次 Q       1次 6     1次 U
               1次 s     1次 T

从结果来看, 按照每列各个字符出现的次数进行降序排序并且按照字符所在列的方式进行对齐.
像这种情况, 该如何进行处理. 还请大家指点, 谢谢大家...

论坛徽章:
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
2 [报告]
发表于 2016-10-03 20:41 |只看该作者
我的代码如下, 未能进行对齐:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my (@aData, @aStat);
  5. while (<DATA>){
  6.     my $pos = 0;
  7.     for (/./g){
  8.         my $k = /\h/ ? "WS" : $_; #WS => WhiteSpace
  9.         $aData[$pos++]{$k}++;
  10.     }
  11. }

  12. foreach my $rh (@aData){
  13.     my $pos = 0;
  14.     foreach my $k (sort {$rh->{$b} <=> $rh->{$a}} keys %{$rh}){
  15.         #push (@{$aStat[$pos++]}, "$k=>$rh->{$k}");
  16.     }
  17. }

  18. #print join ("\t", @$_), "\n" for @aStat;

  19. __DATA__
  20. |dTs8
  21. N6ds85|\4sawd4  1/
  22. Qds5|\4s
  23. Nds85|\4sawd41/*[]df~9D EF+VF-V_S
  24. |sd
  25. NNUs85|
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2016-10-03 21:02 |只看该作者
回复 1# sunzhiguolu

没听过 Perl 的 format? 那看看 perlform 吧

论坛徽章:
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
4 [报告]
发表于 2016-10-03 21:09 |只看该作者
回复 3# MMMIX
大神, 文件的内容是变化的. perlform 能否适应变化?
请大神举个简单的例子, 谢谢...

论坛徽章:
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
5 [报告]
发表于 2016-10-03 21:58 |只看该作者
像这种情况, 通过编程的方式能否解决. 必须能够适应变化, 因为文件的内容不是固定的. 谢谢大家

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
6 [报告]
发表于 2016-10-05 07:48 |只看该作者
回复 5# sunzhiguolu

$ perldoc -f sprintf
    sprintf FORMAT, LIST
            Returns a string formatted by the usual "printf" conventions of
            the C library function "sprintf". See below for more details and
            see sprintf(3) or printf(3) on your system for an explanation of
            the general principles.
     
            ...  

论坛徽章:
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
7 [报告]
发表于 2016-10-05 10:23 |只看该作者
回复 6# jason680
大神, 可能我没有将问题描述清楚. 我举个例子:
如下面文本: (我将每列的字符用不同的背景色进行标识)
STTSP
SSTT
STTVP
期望的结果是:
S,3 T,2 T,3 S,1 P,2
      S,1      T,1
                 V,1




论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-10-05 19:31 |只看该作者
回复 7# sunzhiguolu

$ perl gc.pl
|   d   T   s   8   
N   6   d   s   8   5   |   \   4   s   a   w   d   4           1   /   
Q   d   s   5   |   \   4   s   
N   d   s   8   5   |   \   4   s   a   w   d   4   1   /   *   [   ]   d   f   ~   9   D       E   F   +   V   F   -   V   _   S   
|   s   d   
N   N   U   s   8   5   |   
N,3 d,3 d,2 s,3 8,3 5,2 |,2 4,1 4,1 a,1 w,1 w,1 4,1 1,1 /,1  ,1 1,1 /,1 d,1 f,1 ~,1 9,1 D,1  ,1 E,1 F,1 +,1 V,1 F,1 -,1 V,1 _,1 S,1
|,2 6,1 s,2 8,1 |,1 \,1 \,1 \,1 s,1 s,1 a,1 d,1 d,1 4,1  ,1 *,1 [,1 ],1                                                            
Q,1 N,1 T,1 5,1 5,1 |,1 4,1 s,1                                                                                                     
    s,1 U,1                                                                                                                        

$ cat gc.pl
#!/usr/bin/perl
use strict;
use warnings;

my %hData;
my ($sMax_n, $sMax_m) = (0,0);
while (<DATA>){
  my $sPos = 0;
  while(m/(.)/g){
    print "$1   ";
    $hData{$sPos++}{$1}++;
  }
  $sMax_n = $sPos if($sMax_n < $sPos);
  print "\n";
}


my @aOut;
foreach my $sN (keys %hData){
    my $rh = $hData{$sN};
    my $sPos = 0;
    foreach (sort {$rh->{$b} <=> $rh->{$a}} keys %{$rh}){
        $aOut[$sPos++][$sN] = "$_,$rh->{$_}";
    }
    $sMax_m = $sPos if($sMax_m < $sPos);
}

my $sOut;
foreach my $sM (0 .. $sMax_m-1){
  $sOut = "";
  foreach my $sN (0 .. $sMax_n-1){
    $sOut .= ($aOut[$sM][$sN] // "   "). " " ;
  }
  print "$sOut\n";
}


__DATA__
|dTs8
N6ds85|\4sawd4  1/
Qds5|\4s
Nds85|\4sawd41/*[]df~9D EF+VF-V_S
|sd
NNUs85|

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

论坛徽章:
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
9 [报告]
发表于 2016-10-07 19:36 |只看该作者
本帖最后由 sunzhiguolu 于 2016-10-07 19:40 编辑

回复 8# jason680
谢谢大神指点, 受您的启发 我扩展了下, 代码如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($row, $col, @aData) = (0) x 2;
  5. while (<DATA>){
  6.     print;
  7.     my $pos = 0;
  8.     my @aList = /./g;
  9.     for (@aList){
  10.         $aData[$pos++]{$_}++;
  11.     }
  12.     $row++;
  13.     $col = @aList if ($col < @aList);
  14. }

  15. my @aMatrix;
  16. foreach my $c (0 .. $col - 1){
  17.     my $r = 0;
  18.     foreach my $k (sort {$aData[$c]->{$b} <=> $aData[$c]->{$a}} keys %{$aData[$c]}){
  19.         $aMatrix[$r++][$c] = qq("$k,$aData[$c]->{$k}");
  20.     }
  21.     foreach ($r .. $row - 1){
  22.         $aMatrix[$_][$c] = " " x 5;
  23.     }
  24. }

  25. print "@$_\n" for @aMatrix;

  26. __DATA__
  27. |dTs8
  28. N6ds85|\4sawd4  1/
  29. Qds5|\4s
  30. Nds85|\4sawd41/*[]df~9D EF+VF-V_S
  31. |sd
  32. NNUs85|
复制代码



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP