2009-08-05 2 views
0

私は、ファイル内の行を比較する必要があります。Perlを使ってファイル内の行を比較するにはどうすればよいですか?

KB0005 1019 T IFVATVPVI 0.691 PKC YES 
KB0005 1036 T YFLQTSQQL 0.785 PKC YES 
KB0005 1037 S FLQTSQQLK 0.585 DNAPK YES 
KB0005 1045 S KQLESEGRS 0.669 PKC YES 
KB0005 1045 S KQLESEGRS 0.880 unsp YES 
KB204320 1019 T IFVATVPVI 0.699 PKC YES 
KB204320 1036 T YFLQTSQQL 0.789 PKC YES 
KB204320 1037 S FLQTSQQLK 0.589 DNAPK YES 
KB204320 1045 S KQLESEGRS 0.880 unsp YES 

私は(行は名前が異なって、私は最初の2つの配列にラインを入れてやって管理しており、異なるか繰り返さない行を印刷する必要がありますKB0005KB204320)、その後、perlスクリプト書き込むことによって:

コード:

foreach $item (@a1, @a2) { $count{$item}++;} 

foreach $item (keys %count) { 
    if ($count{$item} == 2) { 
     next; 
    } else { 
     push @diff, $item; 
    } 
} 

my @sorted =sort @diff; 
#print "\nIntersect Array = @isect\n"; 
foreach my $el(@sorted){ 
    print "$el\n"; 
} 

出力リレー:

1019 T IFVATVPVI 0.691 PKC 
1019 T IFVATVPVI 0.699 PKC 
1036 T YFLQTSQQL 0.785 PKC 
1036 T YFLQTSQQL 0.789 PKC 
1037 S FLQTSQQLK 0.585 DNAPK 
1037 S FLQTSQQLK 0.589 DNAPK 
1045 S KQLESEGRS 0.669 PKC 

これはうまくいく、私はちょうど与えられた行が出ている行(KB005または他の)から印刷したいと思う。

どうすればよいですか?

+0

誰でもこの質問を真剣に見てほしい場合は、書式を修正する必要があります。 –

+1

これは宿題のように聞こえる。 – Weegee

+1

彼はそのほとんどを持っていると答えました。宿題かどうか – Xetius

答えて

1

あなただけのユニークなラインを持つものをしたいとあなたは次のスタートを変更することができます:

my %hash =(); 
my $line = 0; 

foreach my $item (@a1, @a2) 
{ 
    $line++ 
    $hash{$item}{count}++; 
    $hash{$item}{line} = $line; 
} 
close FH; 

foreach $item (keys %hash) { 
    if ($hash{$item} > 1) { 
     next; 
    } else { 
     push @diff, $item; 
    } 
} 

my @sorted = sort @diff; 
my $lineNo = 0; 

foreach my $el(@sorted){ 
    $lineNo = $hash{$el}{line}; 
    print "$el, $lineNo\n"; 
} 

または非常にそのような何かを。より詳細なハッシュ構造を作成します。

このコードはテストされていませんが、理論は問題ありません。

コンテンツが1つのファイルからのものである場合、2つの配列を読み込むことについて最初の部分は理解していません。ファイルを読んでいるときにハッシュを作成することでこれを克服することができます:

open FH, "file.txt"; 
while (<FH>) 
{ 
    my @items = split (/ /, $_); 
    my $item = $items[0]; 
    $line++ 
    $hash{$item}{count}++; 
    $hash{$item}{line} = $line; 
} 
close FH; 

しかし、私はこの部分を誤解している可能性があります。

希望これは

アップデート1に役立ちます:私は少し混乱してい

を。私の仕事は、このファイルから一度だけ現れる行(KB0005またはKB204320)または列5の値が異なる行を抽出することです。私は、例えば、持ちたい出力でそう

 
KB0005 has different value at position 1019 for PKC compared to KB204320 [0.691-0.699] 
KB0005 has different value at position 1037 for DNAPK compared to KB204320 [0.585-0.589] 
... 

または

KB has additional record at position 1045 for PKC

アップデート2:

FMのソリューションが動作しています。このスクリプトを他のファイルと組み合わせるにはどうすればいいですか?

私はKB0005KB204320のようなペアのリストを持っていますが、私はこれらのすべてを単独で実行したいと思います。

0

商品をフィルタリングした後でString::Diffを使用できます。

関連する問題