2017-03-29 4 views
0

別のファイルからファイル内の単語をgrepしたいと思います。私のコードはファイルの最後の行に単語をgrepできますが、その前の単語はgrepできません。私は理由と希望がここで助けを得ることができないのか分かりません。以下は、perlスクリプト私が使用している:ファイルからgrepする方法

open(FILE1,"file1.txt") or die "Error, File1 could not open\n";   
open(FILE2,"file2.txt") or die "Error, File2 could not open\n"; 
open(FILE3, ">file3.txt") or die "Error, File3 could not open\n"; 

use strict; 
use warnings; 
use List::MoreUtils qw(uniq); 

my @file1=<FILE1>; 
my @file2=<FILE2>; 
my $j =0; 
my $i =0; 
my $zone =0; 
for ($j=0; $j<=$#file2; $j++){ 
    $zone = $file2[$j]; 
    unless ($zone =~ m/#(.*?)/) { 
     print "$zone"; 
     my @fid = grep /$zone/ , @file1; 
     @fid = uniq(@fid); 
     s{^\s+|\s+$}{}g foreach @fid;    #cancel leading space 
     for ($i=0; $i<=$#fid; $i++){ 
      print FILE3 "$fid[$i]\n"; 
     } 
     #@fid=(); 

    } 
} 

close(FILE3); 

マイFILE1.TXTはこのようなものです:

i am a dog 
i am a cat 
we are the fish 
he is a boy 
she is a girl 

私FILE2.TXTは、このようなものです:

is 
am 

しかし、私のファイル3缶それらの文が含まれていることを示しているだけですが、私は2行目に入れて、最初の行にあると私のファイル3は文章のみを含んでいます。なぜ私のコードが私のファイルの最後の行だけをgrepすることができるのかよく分かりません2。助けてくれてありがとう。

答えて

1

あなたは既にのegrepでこれを行うことができます。

egrep -f file2.txt file1.txt 
2

ファイルからの読み込み、最後の改行が読み、各ラインの一部です。改行をパターン配列から削除するにはchomp

chomp(my @file2 = <FILE2>); 
+0

感謝!! – tim

0

これを試してください。

use strict; 
use warnings; 
use List::MoreUtils qw(uniq); 


open(FILE1,"file1.txt") or die "Error, File1 could not open\n";   
open(FILE2,"file2.txt") or die "Error, File2 could not open\n"; 
open(FILE3, ">file3.txt") or die "Error, File3 could not open\n"; 

my @file1=<FILE1>; 
my @file2=<FILE2>; 
my $j =0; 
my $i =0; 

foreach my $main_line(@file1){ 
    chomp($main_line); 
    foreach my $line(@file2){ 
     chomp($line); 
     if ($main_line =~ /$line/i) { 
      print FILE3 "$main_line\n"; 
     } 
    } 
} 

close(FILE3); 

おかげで、 praveenzx〜

+0

あなたが「修正」したことのもう少し説明から恩恵を受けるだろうと思います。 – Sobrique

1

は、この問題の根本はchompです - あなたは改行を削除していないので、試合が動作していません。

しかし、それはさておき、アドレッシングを行うことができ、あなたのコードにいくつかの問題があります:open (my $file1, '<', 'file1.txt') or die $!; :それはより良いスタイルだと

  • ファイルを開くには、あなたは、字句ファイルハンドルと3引数のオープンを使用する必要があります
  • ループのループではなく、おそらく 'マッチ正規表現'をコンパイルする方がよいでしょう。
  • すべてのファイルを配列に読み込む代わりに、行単位で繰り返し処理することができ、メモリを使用する必要はありません。
  • インデックスを使用して現在の要素にアクセスする場合は、foreach my $line (@things) {構文を使用するほうがはるかに優れています。

だからあなたのコードは、実際のようなものに減少させることができます( 'file3.txt' 内)

#!/usr/bin/env perl 
use strict; 
use warnings; 

open(my $data, '<',"file1.txt") or die $!; 
open(my $search, '<', "file2.txt") or die $!; 
open(my $output, '>', "file3.txt") or die $!; 

chomp (my @search_terms = <$search>); 

#quotemeta is needed to avoid 'special' regex characters doing things. 
my $search_regex = join "|", map { quotemeta }, @search_terms; 

#note - '\b' denotes word boundary, which may not be what you want. 
#means 'is' won't match 'fish' 
#so get rid of them if that's not what you want. 
$search_regex = qr/\b($search_regex)\b/; 

print "Using: $search_regex\n"; 

select $output; #default print destination 
while (<$data>) { 
    print if m/$search_regex/; 
} 

出力:それは仕事

i am a dog 
i am a cat 
he is a boy 
she is a girl 
関連する問題