プロが教えるわが家の防犯対策術!

何万行も書いてあるテキストファイルがあります。抽出したい文字列の一覧がテキストファイルにまとめられています(文字列は約1000個)。抽出したい文字列は一行にひとつづつ書かれています。何万行も書いてあるテキストファイルから抽出したい文字列と二つ合致したらその行を抽出したいです。ここで、注意していただきたいのが、抽出したい文字列一覧から二つの文字列にヒットした行を抽出したいです。宜しくお願い致します。



何万行も書いてあるテキストファイル
aaaaa abc edi
bb aert kkkkkkkkkk lllllll
ddddd aaaaa anhi kkk   
・・・・・・・・
・・・・・・・・

抽出したい文字列一覧のテキストファイル
aaaaa
bbbbb
ddddd
iiiiiiiii
eeeee
・・・・・
・・・・・

A 回答 (4件)

> my $str = "(?:.*?(?:$data)){$more_than}";


> の方がちょっとだけいいかも

確かに。
more_than が大きくなるとぜんぜん違ってくるでしょうね。
    • good
    • 0

my $str = "(:?$data)" . ".*(:?$data)" x ( $more_than - 1 );



my $str = "(?:.*?(?:$data)){$more_than}";
の方がちょっとだけいいかも>#2.

いずれにしても, やるべきことから次第に離れていってる感じは否めない.
    • good
    • 0

おもしろそうなので、ANo.1 さんと同じ使い方になるよう書いてみました。


ロジックは違います。

#!/usr/bin/perl
# this.pl more_than looking_list search_targets [...search_targetsN]
use strict;
use warnings;

my $more_than = shift @ARGV;
my $looking_list = shift @ARGV;

my $regex = do {
open my $in, '<', $looking_list or die;
my @data;
while ( my $line = <$in> ) {
chomp $line;
push @data, "\Q$line\E";
}
close $in;
my $data = join '|', @data;
my $str = "(:?$data)" . ".*(:?$data)" x ( $more_than - 1 );
qr{$str}o;
};

while ( defined( my $line = <> ) ) {
chomp $line;
if ( $line =~ /$regex/ ) {
print $line, "\n";
}
}

exit;

もとの質問は ACL 中の IP アドレスの比較ということなので単純な文字列比較でよいのかは疑問です。

例えば 172.16.0.0/12 と 172.16.1.1 や 172.17.0.0/255.255.255.0 は一致している扱いになるはずです。

対象データの一部でも出した方がよい回答がつくのではないでしょうか。
    • good
    • 0

フィルタコマンドだったら何でもよさそうなので、パッと書けるRubyで書いてみました。


https://ideone.com/t5ekY

コマンドラインとして、次のイメージです。

this.rb 2 抽出したい文字列一覧のテキストファイル 何万行も書いてあるテキストファイル

第一引数でn以上を示すので、1へも3へも変えられます。


自分はPerlにぱっと翻訳できないので、必要があれば他の方の回答を待ってください。
そして、なにより貰った回答へちゃんと返信をつけましょう
http://oshiete.goo.ne.jp/qa/6824950.html
同じ件ですよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!