2013-03-20 6 views
0

디렉터리에있는 텍스트 파일의 거대한 목록에서 특정 키워드가 들어있는 줄을 제거해야합니다. TEST1, Example4를, coding9특정 단어가 포함 된 행을 매스에서 제거 하시겠습니까?

이것은 내가 찾을 수 할 노력하고있어 가장 가까운 예는 다음과 같습니다

예를 들어, 나는 그들에 이러한 키워드 제거 할 모든 라인이 필요 :

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

참고 : 선이 하나가 그것을 :) 제거해야 제거 할 모든 키워드를 포함 할 필요가 없습니다 당신이 읽고 어떤 한 라이너 명령을 찾고있는 것으로 보인다

+0

* 매우 낮은 품질 : * 당신은 무엇을 시도 했습니까? 코드는 어디에 있습니까? –

+0

명령 줄에서? 트릭을 수행 할 매우 간단한 Perl 스크립트를 작성할 수 있습니다. : -/ – DataHerder

+0

Perl은 나에게 좋게 들리지만, 메모장을 사용하여 모든 행을 북마크에 추가 할 수있는 유일한 방법은 있지만 수천 개의 파일에 수백만 줄의 행이 들어 있기 때문에 너무 길어집니다. – syf101

답변

0

및 수천에게 다시 쓰다 파일과 수백만 줄의 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 ''; 
} 
관련 문제