免费注册 查看新帖 |

Chinaunix

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

perl 行去重保留规定条件行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-10 15:17 |只看该作者 |倒序浏览
求助:如下数据,想去掉第3列重复的行且保留的行要使第四列最小
原始数据:
326        0.00        0.00        ( 0 )
63        0.00        2.43        ( 0.0082 )
64        0.00        2.43        ( 0.0082 )
120        0.00        2.43        ( 0 )
340        0.00        4.03        ( 0 )
99        0.00        9.14        ( 0.0229 )
441        0.00        9.14        ( 0.0232 )
142        0.00        10.77        ( 0.0569 )
292        0.00        10.77        ( 0.0393 )
266        0.00        10.77        ( 0.0233 )
想要的结果:
326        0.00        0.00        ( 0 )
120        0.00        2.43        ( 0 )
340        0.00        4.03        ( 0 )
99        0.00        9.14        ( 0.0229 )
266        0.00        10.77        ( 0.0233 )

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
2 [报告]
发表于 2015-07-10 17:05 |只看该作者
perl uniq.pl yourfile > uniq

uniq.pl
我这么写了
  1. #!/usr/bin/perl

  2. my %DATA;

  3. while (<>) {
  4.     my ( $C3, $C4 ) = /^\S+\s+\S+\s+(\S+)\s+\(\s*(\S+)/;
  5.     if ( exists $DATA{$C3} ) {
  6.         $DATA{$C3} = [ $C4, $., $_ ] if $DATA{$C3}[0] > $C4;
  7.     }
  8.     else {
  9.         $DATA{$C3} = [ $C4, $., $_ ];
  10.     }
  11. }

  12. my @LINES = map { $_->[2] } sort { $a->[1] <=> $b->[1] } values %DATA;

  13. print @LINES;

复制代码

评分

参与人数 1可用积分 +2 收起 理由
MMMIX + 2 赞一个!

查看全部评分

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
3 [报告]
发表于 2015-07-10 17:10 |只看该作者
不太懂hash
写了一个还没达到要求的,先准备下班
use strict;
open(A, "e:/perl/A.txt");
my %h;
my @a=<A>;
foreach (@a)
{
        $_=~s/(.*?)\((.*?)\)/$1$2/;
#        print;
        }
foreach (@a)

{my @b=split/\s+/;
        (my $key,my $value)=($b[2],$b[3]);
        $h{$key}=$value;

foreach (sort {$h{$a}<=>$h{$b}} keys %h)
{
        print "$_->$h{$_}\n";
        }

论坛徽章:
0
4 [报告]
发表于 2015-07-10 17:56 |只看该作者
回复 2# substr函数
牛掰

   

论坛徽章:
0
5 [报告]
发表于 2015-07-10 18:02 |只看该作者
$DATA{$C3} = [ $C4, $., $_ ] if $DATA{$C3}[0] > $C4;
中括号里是什么意思

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
6 [报告]
发表于 2015-08-14 17:30 |只看该作者
  1. #!/usr/bin/perl  -w
  2. use strict;
  3. my %hash;
  4. while (<DATA>){
  5. my @all = split /\s\s+/,$_;
  6. my ($num) = $all[3] =~ /\s(\S+)\s/;
  7. $hash{$all[2]}{$num}{$_} = 1;
  8. }
  9. foreach my $same (sort keys %hash){
  10. my @num = keys  %{$hash{$same}};
  11. my $f = shift @num;
  12. for (@num){
  13.   $f = $_ if ($f > $_);
  14. }
  15. my @line = keys %{$hash{$same}{$f}};
  16. print @line;
  17. }

  18. __DATA__
  19. 326        0.00        0.00        ( 0 )
  20. 63        0.00        2.43        ( 0.0082 )
  21. 64        0.00        2.43        ( 0.0082 )
  22. 120        0.00        2.43        ( 0 )
  23. 340        0.00        4.03        ( 0 )
  24. 99        0.00        9.14        ( 0.0229 )
  25. 441        0.00        9.14        ( 0.0232 )
  26. 142        0.00        10.77        ( 0.0569 )
  27. 292        0.00        10.77        ( 0.0393 )
  28. 266        0.00        10.77        ( 0.0233 )
复制代码
回复 1# Li_0817


   

论坛徽章:
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
7 [报告]
发表于 2015-08-15 03:25 |只看该作者
  1. #!/usr/bin/perl
  2. my $c = '\(^oo^)/';

  3. print
  4.   map  { $c eq $_->[0] ? () : do { $c = $_->[0]; $_->[2] } }
  5.   sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] }
  6.   map  { [ (split)[ 2, 4 ], $_ ] } <DATA>

  7. __DATA__
  8. 326        0.00        0.00        ( 0 )
  9. 63        0.00        2.43        ( 0.0082 )
  10. 64        0.00        2.43        ( 0.0082 )
  11. 120        0.00        2.43        ( 0 )
  12. 340        0.00        4.03        ( 0 )
  13. 99        0.00        9.14        ( 0.0229 )
  14. 441        0.00        9.14        ( 0.0232 )
  15. 142        0.00        10.77        ( 0.0569 )
  16. 292        0.00        10.77        ( 0.0393 )
  17. 266        0.00        10.77        ( 0.0233 )
复制代码

论坛徽章:
0
8 [报告]
发表于 2015-08-19 10:43 |只看该作者
++
貌似跟2楼一样了



#!/usr/bin/perl -w
use strict;

my %hash;
while(<DATA>){
        chomp;
        my ($a,$b,$key,$value)=/\s*(\d\S+)\s+(\d\S+)\s+(\d\S+)\s+\((.*)\)/;
        if ( $hash{$key}){
         $hash{$key}=[$a,$b,$value] if ($value < $hash{$key}->[2]) ;
        }
        else {
                $hash{$key}=[$a,$b,$value];
        }
}
printf "%s\t%s\t%s\t(%s) \n",$hash{$_}->[0],$hash{$_}->[1],$_,$hash{$_}->[2]  foreach(sort {$a <=> $b} (keys %hash));

__DATA__
326        0.00        0.00        (0)
63        0.00        2.43        ( 0.0082 )
64        0.00        2.43       ( 0.0082 )
120        0.00        2.43        (0)
340        0.00        4.03       ( 0)
99        0.00        9.14         ( 0.0229  )
441        0.00        9.14         (0.0232)
142        0.00        10.77         (0.0569)
292        0.00        10.77         (0.0393)
266        0.00        10.77        (0.0233)

论坛徽章:
0
9 [报告]
发表于 2016-05-03 11:19 |只看该作者
楼上的大神们写的时候能不能稍微加点注释,小白表示看着好吃力

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
10 [报告]
发表于 2016-05-04 01:26 |只看该作者
$> cat  bbb|perl -00pne '1  while (s/(.+ ([.\d]+) +\( *(.+) *\) *)\n(.+\2 *\( *(.+) *\) *)/$3 < $5? $1: $4/ge)'

326        0.00        0.00        ( 0 )
120        0.00        2.43        ( 0 )
340        0.00        4.03        ( 0 )
99        0.00        9.14        ( 0.0229 )
266        0.00        10.77        ( 0.0233 )
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP