如何得到相同列的行!

如何得到相同列的行!

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怎么写才能达到!谢谢!
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


QUOTE:
原帖由 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怎么写才能达到!谢谢!



[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#use strict;
use warnings;

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

foreach ( sort keys %hash){
  my @array = split /\s+/,$hash{$_};
  my $key = $_;
  next if (@array < 2);
  foreach (@array){
    print "$key  $_\n";
    }
    }



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

谢谢!
if(@array < 2)
这个是什么意思呀?不太懂了!
用hash指向一个列表的引用 该列表中存放 第二列的数据
#!/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;


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

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



QUOTE:
原帖由 mousejsh 于 2008-2-21 14:58 发表
if(@array < 2)
这个是什么意思呀?不太懂了!

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


[Copy to clipboard] [ - ]
CODE:
my $text = shift;
my %hash;
open my $file,"<","$text" or die "Fail to open $text $!";
while(<$file>){
  chomp;
  my ($key,$value) = split/\s+/;
  $hash{$key} .= "$value ";
  }

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


QUOTE:
原帖由 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"