2011-10-18 67 views
1

我想從與特定模式匹配的文件中提取行,並且我想對500多個文件執行此操作。它應該有能力保留文件的唯一名稱。根據文本模式選擇行

我用awk,但後來我必須單獨做每個文件。

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

在這裏的鏈接(http://bit.ly/nMX8qh)我想只保留有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的文件,並讀入您想要給它的文件名列表。然後它遍歷該列表,逐一打開每個文件,逐個掃描每個文件,並且如果找到包含觸發文本的行,則會打印文件名和行號以及觸發器所在的行本身滿足。然後它轉向下一個。

+0

謝謝DavidO。此代碼適用於我。感謝幫助。 – Krishnan

+0

不客氣。很高興它正在軌道上。 – DavidO

1
perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv