我想从与特定模式匹配的文件中提取行,我想为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: $!";
}
答案 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的文件,并读入您想要提供的文件名列表。然后它遍历该列表,逐个打开每个文件,逐个扫描每个文件,如果找到包含触发文本的行,则打印文件名和行号,以及触发器所在的行本身满足。然后它继续前进到下一个。