2011-10-18 24 views
1

特定のパターンに一致するファイルから行を抽出したいので、500を超えるファイルに対してこれを実行します。また、ファイルの一意の名前を保持する能力も必要です。テキストパターンに基づいて行を選択

awkを使用しましたが、各ファイルを個別に実行する必要があります。ここにリンク(http://bit.ly/nMX8qh)に示す例では

c:\>gawk "/S1901/" Census_Tract_*.csv > Census_Tract_*.csv 

私は彼らにS1901を持っているレコードだけを保持したいです。外部リンクの申し訳ありませんが、私はテーブルのフォーマットを保持することができません。

私はそれを書くために使用したいくつかのperlコードを見つけましたが、すべての行を保持し、パターンが一致する行/レコードだけを選択しません。どんなヒントも高く評価されます。 perlのコードは以下の通りです:

#perl -w 
$pattern = "Subject_Census*.csv"; # process only those files that match pattern 
while (defined ($in = glob($pattern))) { 
    ($out = $in) =~ s/\.csv$/.outcsv/;   # read from "xyz.in" and write to "xyz.out" 
    open (IN, "<", $in) or die "Can't open $in for reading: $!"; 
    open (OUT,">>", $out) or die "Can't open $out for writing: $!"; 
    while (<IN>) { 
    $mystring =~ /S1901/; 
    print OUT $_ if $mystring == 0; 
    } 
    close (IN) or die "Can't close $in: $!"; # good idea to do some housekeeping 
    close (OUT) or die "Can't close $out: $!"; 
} 

答えて

1

未テスト:

use strict; 
use warnings; 
use autodie; 

my $files_list_filename = 'files.txt'; 

open my $fl, '<', $files_list_filename; 
my @list_of_files = <$fl>; 
chomp @list_of_files; 
close $fl; 

foreach my $file (@list_of_files) { 
    open my $test_fh, '<', $file; 
    while (my $line = <$test_fh>) { 
     if($line =~ m/S1901/) { 
      print "$file at $.: $line"; 
     } 
    } 
    close $test_fh; 
} 

はあなたが考えていたものの一種ですか?これは、filelist.txtという名前のファイルを開き、それに多くのファイル名のリストを読み込みます。次に、各ファイルを1つずつ開いて、そのファイルを1つずつスキャンし、トリガーテキストを含む行が見つかると、ファイル名と行番号、およびトリガーがあった行自体を出力します会ったその後、次のものに移動します。

+0

ありがとうDavidO。このコードは私のために働く。ヘルプをよろしくお願いいたします。 – Krishnan

+0

ようこそ。それはうれしかったです。 – DavidO

1
perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv 
関連する問題