免费注册 查看新帖 |

Chinaunix

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

如何得到相同列的行! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-20 22:16 |只看该作者 |倒序浏览
1.txt
a4c3 141
a3s1 3
b4c3 111
s21a 5
b92x 3
a3s1 52
62ae 2
a4c3 1
7z5y 9
我想要得到下面这个结果。
2.txt
a3s1 3
a3s1 52
a4c3 1
a4c3 141
请问perl怎么写才能达到!谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-02-20 23:05 |只看该作者
C:\Documents and Settings\wjc\桌面>perl -e "open(A,'1.txt');foreach(<A>){if(m/^a
3s1/||m/^a4c3/){print;}}"
a4c3 141
a3s1 3
a3s1 52
a4c3 1

论坛徽章:
0
3 [报告]
发表于 2008-02-21 00:19 |只看该作者
原帖由 mousejsh 于 2008-2-20 22:16 发表
1.txt
a4c3 141
a3s1 3
b4c3 111
s21a 5
b92x 3
a3s1 52
62ae 2
a4c3 1
7z5y 9
我想要得到下面这个结果。
2.txt
a3s1 3
a3s1 52
a4c3 1
a4c3 141
请问perl怎么写才能达到!谢谢!

  1. #!/usr/bin/perl
  2. #use strict;
  3. use warnings;

  4. my $text = shift;
  5. my %hash;
  6. open my $file,"<","$text" or die "Fail to open $text $!";
  7. while(<$file>){
  8.   chomp;
  9.   my ($key,$value) = split/\s+/;
  10.   $hash{$key} .= "$value ";
  11.   }

  12. foreach ( sort keys %hash){
  13.   my @array = split /\s+/,$hash{$_};
  14.   my $key = $_;
  15.   next if (@array < 2);
  16.   foreach (@array){
  17.     print "$key  $_\n";
  18.     }
  19.     }

复制代码

<lig@other-server:~/chinaunix>$ ./identical a
a3s1  3
a3s1  52
a4c3  141
a4c3  1

论坛徽章:
0
4 [报告]
发表于 2008-02-21 08:29 |只看该作者
谢谢!

论坛徽章:
0
5 [报告]
发表于 2008-02-21 14:58 |只看该作者
if(@array < 2)
这个是什么意思呀?不太懂了!

论坛徽章:
0
6 [报告]
发表于 2008-02-25 17:47 |只看该作者

回复 #1 mousejsh 的帖子

用hash指向一个列表的引用 该列表中存放 第二列的数据

论坛徽章:
0
7 [报告]
发表于 2008-02-26 00:39 |只看该作者
#!/usr/bin/perl

use strict;
use warnings;
open FH, "<same.txt" || die "$!";
while (<FH>) {
    s/\s+$//g;
    my %hash = map { /(a\d\S+)\s+(\d+)/ } <FH>;
    foreach ( sort keys %hash ) {
        print "$_\t$hash{$_}\n";
    }
}
close FH;

g:/home/perl-exercise # ./same.pl
a3s1    52
a4c3    1

最初是这样想的,结果错了,第二次匹配的结果覆盖了第一次的。
大家有什么巧妙的方法实现么?交流交流,长长见识!

[ 本帖最后由 mouse.rice 于 2008-2-26 00:41 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-02-26 12:54 |只看该作者
原帖由 mousejsh 于 2008-2-21 14:58 发表
if(@array < 2)
这个是什么意思呀?不太懂了!

在scalar的环境中
@array返回的是数组中元素的个数

论坛徽章:
0
9 [报告]
发表于 2008-02-26 13:17 |只看该作者

  1. my $text = shift;
  2. my %hash;
  3. open my $file,"<","$text" or die "Fail to open $text $!";
  4. while(<$file>){
  5.   chomp;
  6.   my ($key,$value) = split/\s+/;
  7.   $hash{$key} .= "$value ";
  8.   }
复制代码


请问这个如何保证同样的key的value的值不被下一个替换?

论坛徽章:
0
10 [报告]
发表于 2008-02-26 13:49 |只看该作者
原帖由 linuxnextyear 于 2008-2-26 13:17 发表

my $text = shift;
my %hash;
open my $file,"



注意看
$hash{$key} .= "$value "

相同的key,不同的value之间以空格分割,并且连在一起作为一个新的value
比如说
a b
a c
一开始
$hash{a} = b
接着
$hash{a} = "b c"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP