• 締切済み

Part2 ファイルから検索条件を読み込んでGREPした結果を出力したい。

INPUTファイルを以下のように作成します。 >input.txt 伝票番号1 伝票番号2 伝票番号3 ・ ・ ・ 特定のフォルダ内の複数ファイル(input.txtと同じ階層でもいいです)に対して grepを順に伝票番号1,伝票番号2,伝票番号3・・・ というようにinput.txtから読み込んで、ヒットした伝票番号をoutput.txtファイルに 「ヒットしたファイル名A 伝票番号1」 「ヒットしたファイル名A 伝票番号2」 「ヒットしたファイル名B 伝票番号1」 「ヒットしたファイル名C 伝票番号3」 ・ ・ ・ というように出力したいと思っております。(最悪、伝票番号だけも可なんですが) どなたかもしよろしけばご教授よろしくお願い致します。

みんなの回答

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.4

素直に書いてみました。 use File::Basename; my $input_file = 'input.txt'; my $output_file = 'output.txt'; my $script_file = basename($0); my $target_dir = '.'; open my $in, '<', $input_file or die "$!"; my @search_words = <$in>; close $in or die "$!"; chomp @search_words; my $re_search_words = join( '|', map {quotemeta} @search_words ); my $re_exclusion_files = join( '|', map {quotemeta} ($input_file, $output_file, $script_file) ); my @target_files = grep !/$re_exclusion_files/, glob("$target_dir/*.*"); open my $out, '>', $output_file or die "$!"; for my $target_file (@target_files) { my $target_basename = basename($target_file); open my $in, '<', $target_file or die "$!"; while (my $line = <$in>) { if ( $line =~ /$re_search_words/ ) { my $match_word = substr($line, $-[0], $+[0] - $-[0]); print {$out} "ヒットしたファイル名 $target_basename $.行目 $match_word\n"; } } close $in or die "$!"; } close $out or die "$!";

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あそっか, それでいいんでしたね>#2. grep があれば, ですが.

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

スクリプトを丸々書いてほしいのならそう書いたほうがいいと思います。 それで書き手が出てくるかどうかは別の問題ですが。 んで、質問にある項目に関してのみいえば(後付で条件増やされなければ) 通常の grep コマンド(perlのgrep演算子ではなく)でできますね。 grep -f INPUT データファイル… ファイル名も表示したいならそれ用のオプションもつけると。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「どう書くときれいか」を別にすれば, やりたいことをそのまま書けばいいのでは? 簡単にやるなら「特定のファイルに特定の文字列が存在するかどうか」を判定するサブルーチンを作って, これを全てのファイルと全ての文字列に対して実行する. そんだけ. 上の「~」くらいは書けますよね.