除外ファイルに記載されているパターンのいずれかに一致する行を入力ファイルから削除したい。
入力ファイルは非常に大きい (~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;
効率性に関して、さまざまなアプローチについてのフィードバックをお待ちしております。前述したように、私の入力ファイルは巨大でファイル数も多いため、次の懸念点は実行時間です。