0

除外ファイルに記載されているパターンのいずれかに一致する行を入力ファイルから削除したい。

入力ファイルは非常に大きい (~500 MB) ため、効率的なソリューションも探しています。

以下の例は単なるサンプルであり、除外には特殊文字を含む複雑なパターンが含まれる場合があることに注意してください。/

除外リストを含むファイル ( exception )

Jun
Jul
Aug

入力ファイル ( infile )

Jan 02, 2013
Jul 02, 1988
Feb 02, 1988
Jun 02, 1988
Feb 02, 1988
Aug 02, 1988
Jan 02, 2013
Sep 02, 1988
Mar 02, 1988
Jun 02, 1988
Nov 02, 1988

必要な出力 ( outfile )

Jan 02, 2013
Feb 02, 1988
Feb 02, 1988
Jan 02, 2013
Sep 02, 1988
Mar 02, 1988
Nov 02, 1988

除外リストを指定して、次のコマンドを使用できますが、正常に動作します。

egrep -v "Jun|Jul|Aug" infile > outfile

私の問題は|、例外ファイルからパイプで区切られた文字列を取得して、上記の grep コマンドに渡す方法です。または、これを達成するための他の最適な方法はありますか?

perlこれを、ハッシュを介してさらに処理するソリューションの一部として実装する必要があります。しかし、私は自分の perl スクリプト内からこれらのコマンドを実行できるので、あらゆる Linux ソリューションに対してオープンです。

この点であなたの助けは非常に高く評価されます.

アップデート

その間、人々は彼らの解決策で私を助けてくれています.次のコードを書くことができperl、それもうまくいきました.

#!/usr/bin/perl
use warnings;
use strict;

open my $exfread, '<', "exception" or die $!;
chomp ( my @exclusions = <$exfread> );
close $exfread;
my $ex_str = join '|', @exclusions;
# print $ex_str . "\n";

open my $infread, '<', "infile" or die $!;
open my $outfwrite, '>', "outfile" or die $!;

while (<$infread>) {
    next if /${ex_str}/;    
    print $outfwrite $_;
    # do some more processing using hash
}

close $outfwrite;
close $infread;

効率性に関して、さまざまなアプローチについてのフィードバックをお待ちしております。前述したように、私の入力ファイルは巨大でファイル数も多いため、次の懸念点は実行時間です。

4

4 に答える 4

4

このプログラムはあなたの目的に合うはずです。exception.txt各行を代替演算子 で結合することにより、 の内容から正規表現を形成することによって機能し|ます。次に、正規表現は でコンパイルされqrます。

各行に対して単一の正規表現比較のみが実行されるため、これは非常に高速であることがわかります。

use strict;
use warnings;
use autodie;

my $regex = do {
  open my $in,  '<', 'exception.txt';
  my @infile = <$in>;
  chomp @infile;
  local $" = '|';
  qr/@infile/;
};

open my $in,  '<', 'infile.txt';
open my $out, '>', 'outfile.txt';

while (<$in>) {
  print $out $_ unless $_ =~ $regex;
}

出力

Jan 02, 2013
Feb 02, 1988
Feb 02, 1988
Jan 02, 2013
Sep 02, 1988
Mar 02, 1988
Nov 02, 1988
于 2013-10-09T21:01:03.907 に答える
2

あなたの例では、この行は機能します:

grep -vf exception infile
于 2013-10-09T21:01:06.930 に答える
1
grep -vf patternfile 

unix コマンドと同じことを行う必要があります。

于 2013-10-09T21:02:30.893 に答える