免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: amoshaochen
打印 上一主题 下一主题

unix下对文件的列值排序比较问题 [复制链接]

论坛徽章:
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
21 [报告]
发表于 2010-03-01 15:30 |只看该作者
回复 20# amoshaochen


    晕。
    原来是生成表头啊。用BEGIN或者手动修改。

论坛徽章:
0
22 [报告]
发表于 2010-03-01 15:34 |只看该作者
.。。。
我用过BEGIN了。结果又生成类似的东西,仍然是一个数字,不是我想要的列名
额 。。。
我再看看了

论坛徽章:
0
23 [报告]
发表于 2010-03-02 09:25 |只看该作者
你们别这样 我还是没看懂啊

楼主 按照你一楼写的 输出的结果应该是
49371 2 29624 54
49371 29 29624 54
49371 61 29624 54
49372 17 29624 31
49372 2 29624 31
49373 2 29624 63
49373 2 29624 63
49373 76 29624 63
49373 78 29624 63

这样啊....

一会儿又说
78 = 3
73 = 2..
你不是说 2 4 相同的话 就把该行第二列换成2么....


完全不知道你要的...

这是我的代码

  1. #!/usr/bin/perl -w

  2. use strict;


  3. my %hash;
  4. while (<DATA>) {
  5.     chomp;
  6.     my @array = split;
  7.     $array[1] = 2 if ($array[1] == $array[3]);
  8.     my $key = "$array[0]$array[2] $array[1]";
  9.     push @{$hash{$key}}, "$array[0] $array[1] $array[2] $array[3]";
  10. }

  11. print "row1 row2 row3 row4\n";
  12. foreach my $key (sort keys %hash) {
  13.     foreach (@{$hash{$key}}) {
  14.         print "$_\n";
  15.     }
  16. }


  17. __DATA__
  18. 49373        78        29624        63
  19. 49373        76        29624        63
  20. 49373        63        29624        63
  21. 49373        2         29624        63
  22. 49372        31        29624        31
  23. 49372        17        29624        31
  24. 49371        61        29624        54
  25. 49371        54        29624        54
  26. 49371        29        29624        54
复制代码

论坛徽章:
0
24 [报告]
发表于 2010-03-02 09:43 |只看该作者
看懂了 但是搞不定啊。
第一步 2 4 column 相等的 置0
第二部 1 column 相同的基础上 排序(没有排第0位的)。
第三部  2 column 的值被 排序顺序替换

perl 搞不定老出错

论坛徽章:
0
25 [报告]
发表于 2010-03-02 09:55 |只看该作者
本帖最后由 nuclearxin 于 2010-03-02 09:58 编辑

。。。。。。。
明白了
主值的顺序还要嵌入到排序中nnd
第二部和第三部 返货来

论坛徽章:
0
26 [报告]
发表于 2010-03-02 10:21 |只看该作者
对 你把第一和第三列  空格 第二列 嵌入到key里面

然后让他排序

他默认是从左到右的 就是以key来拍
1+3 空格2
1+3 一样的 就会自动以2来排列 不过我还是没看懂楼主要什么

论坛徽章:
0
27 [报告]
发表于 2010-03-02 10:42 |只看该作者
  1. awk 'NR==FNR{if ($2!=$4) a[$1" "$3]++}NR>FNR{if (FNR==1) {print;next}if ($2!=$4) $2=a[$1" "$3]--;else $2=0;print}' file file
复制代码

论坛徽章:
0
28 [报告]
发表于 2010-03-02 13:34 |只看该作者
本帖最后由 nuclearxin 于 2010-03-02 14:35 编辑

非常复杂的 弄出来了 。。呵呵

  1. #!/usr/bin/perl -w
  2. my (@temp,@subtemp,@t,$ref1,%d,$aa,$bb);

  3. sub so {
  4.         (split /[ \t]+/,$b)[1] <=> (split /[ \t]+/,$a)[1];
  5.         }
  6. sub sortn {
  7.         $b <=> $a;
  8.         }

  9. sub sortid{
  10.         @subtemp = sort so @{$_[0]};
  11.         $bb=10000;
  12.         for($i=0;$i<=$#subtemp;$i++){
  13.                 @t = split /[ \t]+/,$subtemp[$i];
  14.                 $aa = @subtemp - $i;
  15.                 $bb = $aa if($t[1] == $t[3]);
  16.                 $subtemp[$i] =~ s/(^\d+\D+)(\d+)(.*)/$1$aa$3/  ;
  17.                 }
  18.         for($i=0;$i<=$#subtemp;$i++){
  19.                 @t = split /[ \t]+/,$subtemp[$i];
  20.                 $subtemp[$i] =~ s/(^\d+\D)(\d+)(.*)/${1}0$3/ if ($t[1] == $bb);
  21.                 if ($t[1] > $bb){
  22.                 $t[1]--;
  23.                 $subtemp[$i] =~ s/(^\d+\D)(\d+)(.*)/${1}$t[1]$3/;
  24.                         }
  25.                 }
  26.         }

  27. while (<>){
  28.         chomp;
  29.         my @line = split /[ \t]+/,$_;
  30.         $d{$line[0]} .= "@line \n";
  31.         }

  32. foreach (sort sortn keys %d){
  33.         @temp = split /\n/,$d{$_};
  34.         $ref1 = \@temp;
  35.         sortid $ref1;
  36.         foreach (@subtemp){
  37.                 print $_,"\n";
  38.                 }
  39.         }
复制代码

论坛徽章:
0
29 [报告]
发表于 2010-03-02 13:44 |只看该作者
好多垃圾代码 谁帮忙 删除删除

论坛徽章:
0
30 [报告]
发表于 2010-03-02 14:34 |只看该作者
这个省内存

  1. #!/usr/bin/perl -w
  2. use strict;
  3. my (@temp,@subtemp,@t,$ref1,$aa,$bb,$tt);
  4. $ref1 = \@temp;
  5. $tt = "";
  6. sub so {
  7.         (split /[ \t]+/,$b)[1] <=> (split /[ \t]+/,$a)[1];
  8.         }

  9. sub sortid{
  10.         @subtemp = sort so @{$_[0]};
  11.         $bb=1000;
  12.         for(my $i=0;$i<=$#subtemp;$i++){
  13.                 @t = split /[ \t]+/,$subtemp[$i];
  14.                 $aa = @subtemp - $i;
  15.                 $bb = $aa if($t[1] == $t[3]);
  16.                 $subtemp[$i] =~ s/(^\d+\D+)(\d+)(.*)/$1$aa$3/  ;
  17.                 }
  18.         for(my $i=0;$i<=$#subtemp;$i++){
  19.                 @t = split /[ \t]+/,$subtemp[$i];
  20.                 $subtemp[$i] =~ s/(^\d+\D)(\d+)(.*)/${1}0$3/ if ($t[1] == $bb);
  21.                 if ($t[1] > $bb){
  22.                 $t[1]--;
  23.                 $subtemp[$i] =~ s/(^\d+\D)(\d+)(.*)/${1}$t[1]$3/;
  24.                         }
  25.                 }
  26.         }

  27. while (<>){
  28.         chomp;
  29.         my @line = split /[ \t]+/,$_;
  30.         if($tt eq ""){
  31.                 push @temp,"@line" ;
  32.                 $tt = $line[0] ;
  33.                 next;
  34.                 }

  35.         if($line[0] != $tt){
  36.                 sortid $ref1;
  37.                 foreach (@subtemp){
  38.                 print $_,"\n";
  39.                         }
  40.                 @temp =();
  41.                 push @temp,"@line";
  42.                 $tt = $line[0];
  43.                 next;
  44.                 }
  45.         push @temp,"@line" ;
  46.         $tt = $line[0] ;

  47.         }
  48. sortid $ref1;
  49. foreach (@subtemp){
  50.         print $_,"\n";
  51.            }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP