【问题标题】:Select rows based on text pattern根据文本模式选择行
【发布时间】:2011-10-18 09:04:42
【问题描述】:

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

【问题讨论】:

    标签: perl awk


    【解决方案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 的文件,并读入一个包含你想给它的文件名的列表。然后它遍历该列表,逐个打开每个文件,逐个扫描每个文件,如果找到包含触发文本的行,它会打印文件名和行号,以及触发所在的行本身遇见了。然后继续下一个。

    【讨论】:

      【解决方案2】:
      perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        • 2021-04-01
        • 1970-01-01
        • 2020-04-01
        • 2017-05-08
        相关资源
        最近更新 更多