2011-10-18 5 views
1

특정 패턴과 일치하는 파일에서 행을 추출하려면 500 개가 넘는 파일에 대해이 작업을 수행하고 싶습니다. 또한 파일의 고유 한 이름을 유지할 수 있어야합니다.텍스트 패턴을 기반으로 행 선택

awk를 사용했지만 각 파일을 개별적으로 수행해야합니다. 여기 링크 (http://bit.ly/nMX8qh) 내가 그들에 S1901을 만 기록을 보유 할의 예에서

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

. 외부 링크에 사과하지만 나는 테이블의 형식을 유지할 수 없습니다.

필자가 쓰던 일부 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라는 파일을 열고 당신이 원하는 많은 파일 이름의 목록을 읽습니다. 그런 다음이 목록을 반복하여 각 파일을 하나씩 열어 각 파일을 하나씩 검색하고 트리거 텍스트가 포함 된 행이 발견되면 파일 이름과 행 번호, 트리거가 있던 행 자체를 인쇄합니다 만났다. 그런 다음 다음 단계로 이동합니다.

+0

감사합니다. DavidO. 이 코드는 저에게 효과적입니다. 도움을 감사하십시오. – Krishnan

+0

당신은 오신 것을 환영합니다. 다행이었습니다. – DavidO

1
perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv 
관련 문제