Выберите строки на основе текстового шаблона - PullRequest
1 голос
/ 18 октября 2011

Я хочу извлечь строки из файла, которые соответствуют определенному шаблону, и я хочу сделать это для более чем 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 ]

1 голос
/ 18 октября 2011

Не проверено:

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 голос
/ 18 октября 2011
perl -ni.bak -e 'print if /S1901/' Subject_Census*.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...