0

ディレクトリにあるテキスト ファイルの膨大なリストから、特定のキーワードを含む行をすべて削除する必要があります。

たとえば、次のキーワードのいずれかを含むすべての行を削除する必要があります: test1、example4、coding9

これは、私が見つけようとしていることに最も近い例です。

sed '/Unix\|Linux/d' *.txt

注: 削除するすべてのキーワードを行に含める必要はありません。1 つだけ削除する必要があります :)

4

1 に答える 1

0

数千のファイルと数百万の行を読み書きするための1つのライナーコマンドを探しているようです。私はPerlで素早く汚いスクリプトを書きたいので、個人的にはそうはしません。私はこれを非常に単純なファイルで非常に簡単にテストしましたが、機能しますが、数千のファイルと数百万の行を処理しているため、検証できるように、最初にテストディレクトリに書き込んだファイルをいくつかのファイルでテストします。

#!/usr/bin/perl

# the initial directory to read from
my $directory = 'tmp';
opendir (DIR, $directory) or die $!;

my @keywords = ('woohoo', 'blah');

while (my $file = readdir(DIR)) {

    # ignore files that begin with a period
    next if ($file =~ m/^\./);

    # open the file
    open F, $directory.'/'.$file || die $!;
    # initialize empty file_lines
    @file_lines = ();

    # role through and push the line into the new array if no keywords are found
    while (<F>) {
        next if checkForKeyword($_);
        push @file_lines, $_;
    }
    close F;

    # save in a temporary file for testing
    # just change these 2 variables to fit your needs
    $save_directory = $directory.'-save';
    $save_file = $file.'-tmp.txt';
    if (! -d $save_directory) {
        `mkdir $save_directory`;
    }
    $new_file = $save_directory.'/'.$save_file;
    open S, ">$new_file" || die $!;
    print S for @file_lines;
    close S;
}

# role through each keyword and return 1 if found, return '' if not
sub checkForKeyword()
{
     $line = shift;
     for (0 .. $#keywords) {
         $k = $keywords[$_];
         if ($line =~ m/$k/) {
           return 1;
         }
     }
     return '';
}
于 2013-03-20T02:22:31.647 に答える