- ベストアンサー
Perlを使用して特定行を抽出する方法
- 何万行も書いてあるテキストファイルから特定の文字列と一致する行を抽出する方法をPerlを使用して解説します。
- テキストファイルにまとめられた抽出したい文字列の一覧から二つの文字列と合致する行を抽出する手順を説明します。
- Perlを利用してテキストファイルから複数の条件に合致する行を抽出する方法を解説します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> my $str = "(?:.*?(?:$data)){$more_than}"; > の方がちょっとだけいいかも 確かに。 more_than が大きくなるとぜんぜん違ってくるでしょうね。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
my $str = "(:?$data)" . ".*(:?$data)" x ( $more_than - 1 ); は my $str = "(?:.*?(?:$data)){$more_than}"; の方がちょっとだけいいかも>#2. いずれにしても, やるべきことから次第に離れていってる感じは否めない.
- t-okura
- ベストアンサー率75% (253/335)
おもしろそうなので、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 は一致している扱いになるはずです。 対象データの一部でも出した方がよい回答がつくのではないでしょうか。
- sholmes
- ベストアンサー率81% (89/109)
フィルタコマンドだったら何でもよさそうなので、パッと書けるRubyで書いてみました。 https://ideone.com/t5ekY コマンドラインとして、次のイメージです。 this.rb 2 抽出したい文字列一覧のテキストファイル 何万行も書いてあるテキストファイル 第一引数でn以上を示すので、1へも3へも変えられます。 自分はPerlにぱっと翻訳できないので、必要があれば他の方の回答を待ってください。 そして、なにより貰った回答へちゃんと返信をつけましょう http://okwave.jp/qa/q6824950.html 同じ件ですよね?