根据文本模式选择行

时间:2011-10-18 00:21:29

标签: perl awk

我想从与特定模式匹配的文件中提取行,我想为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: $!";
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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的文件,并读入您想要提供的文件名列表。然后它遍历该列表,逐个打开每个文件,逐个扫描每个文件,如果找到包含触发文本的行,则打印文件名和行号,以及触发器所在的行本身满足。然后它继续前进到下一个。