• 締切済み

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」 ・ ・ ・ というように出力したいと思っております。(最悪、伝票番号だけも可なんですが) どなたかもしよろしけばご教授よろしくお願い致します。

  • Perl
  • 回答数4
  • ありがとう数1

みんなの回答

  • 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

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

関連するQ&A

  • ファイルから検索条件を読み込んでGREPを実行したい

    INPUTファイルを以下のように作成します。 >input.txt aaa bbb ccc ・ ・ ・ 特定のディレクトリの複数ファイルに対して grepを順にaaa,bbb,ccc・・・ というようにinput.txtから読み込んで実行し、結果をそれぞれaaa.txt,bbb.txt,ccc.txt・・・ へ出力したいのですが、方法がわからなくて困っています。 どなたかご教授お願いいたします。

    • ベストアンサー
    • Perl
  • 秀丸のGREP検索

    GREP検索をした時、該当する単語のある行が表示されなくなってしまいました。 viyon.txt(17) suisen.txt(114) のようにファイル名と行番号しか表示されません。 以前は、検索単語と周囲の文字列も表示されてたんですけど・・・・・・ 元に戻せませんか?

  • 秀丸エディターでのGREP検索で

    秀丸でGREP検索をすると、 ファイル名 (行行番号) 単語 という形式で出力されますが、ファイル名 (行行番号) の部分が余分です。もちろん、後で置き換えして削除することはできますが、最初からファイル名 (行行番号) を出力させないようにするにはどうすればいいのでしょうか?

  • grepでファイル名を取得したい。

    いま以下の構成になっています。 カレントディレクトリの(ディレクトリを除く)ファイル名を取得し,list.txtに出力する作業をやってます。 そういうオプションがあれば良いのですがなかなか見つかりません。知恵をお貸しください。 list -F |& grep (???) > list.txt -Fでディレクトリの最後に/がつくので,(???)の部分でそれらのファイルを除く,とする方針…?と思ったのですが,うまいやり方が見つかりません。 よろしくお願いします。

  • 秀丸エディタでgrepを行うと前に余計なファイル名と数字が付け加えられる

    grepを行うと、文字の前にファイル名.txtと数字行(****)が付け加えられます 例えば、 aaa bbb をgrepで実行すると .txt(2659):aaa .txt(2660):bbb のようにファイル名と数字行が入ってしまいます。 前につけないように、grepを実行するにはどうすればよいのでしょうか?

  • ファイル内のキーを元に別のファイルをgrepする

    初めて質問させていただきます。 Perlを使って下記のことをじっそうしたいと思っています。 □テーブルから抽出したdata.csvの中に、外字文字コードが存在するか確認する。もし存在する場合は、その行を別のファイル(output.csv)へ出力する。 Perlで下記のような構造でプログラミングしたいと思っていますが、知識が乏しいため、どなたかサンプルコードをご提供いただけますでしょうか。 □外字文字コードをもつtest.txtを一行ずつ読み込み、そちらを検索キーとして、data.csv内をgrepし、該当行があったら、output.csvへ出力する。 test.txt \x40\xB0, \x41\xB1, \x43\xB2

  • 2つのアダプタ出力結果は同じ?

    ACアダプタに関してお聞きしたく質問しました。 1つは AC INPUT : 100-200Vac / 1.2A DC OUTPUT : +5V/2A , +12V/2A もう片方は AC INPUT : 100-200Vac / 0.5A DC OUTPUT : +5V/2A , +12V/2A DC出力の表示がおなじであればどちらもDCの出力結果は同じという判断で正しいでしょうか。

  • c++ 入力、出力まわりについて

    Mac OSX 10.7.3です。 c++で書いたプログラムをコンパイルして以下のような数字の集まりを上の行から順に入力したいです。 このプログラムはこの数字列の値により出力をするものとします。 3 3 6 100 2 64 main.cppというコードを使っていて上の数字を保存した input.txtというファイルがあり、output.txtという出力ようのファイルがDesktop下にあります。 ここでターミナルで cd Desktop/ g++ -Wall main.cpp ./a.out < input.txt > output.txt とリターンしてもうまくoutput.txtに出力されません。

  • FORTRAN:出力ファイルをフォルダごとに整理するには

    出力ファイルの数が多いので、出力と同時にフォルダごとに整理したいのですがうまくいきません。 具体的に言うと、例えば CHARACTER DEF(2)*1 DATA DEF/'1.txt','2.txt'/ DO 10 NB=1,2 OPEN(10,FILE='A-A\output-'//DEF(NB)) 10 CONTINUE END というプログラムで出力すると、 A-Aというフォルダ内にoutput-1.txt、output-2.txtが作成されます。 これを発展させて、二つ以上のフォルダ内に出力する方法をいろいろ試したのですが、うまくいきません。 わかる方がいらっしゃれば、どうかご回答お願いいたします。 以下は、試したがうまくいかなかったプログラムです。 CHARACTER ABC(2)*5 CHARACTER DEF(2)*1 DATA ABC/'A','B'/ DATA DEF/'1.TXT','2.TXT'/ DO 20 NA=1,2 DO 10 NB=1,2 OPEN(10,FILE='A-'//ABC(NA)\output-'//DEF(NB)) 10 CONTINUE 20 CONTINUE END

  • FORTRAN:出力ファイルをフォルダごとに整理するには

    出力ファイルの数が多いので、出力と同時にフォルダごとに整理したいのですがうまくいきません。 具体的に言うと、例えば CHARACTER DEF(2)*1 DATA DEF/'1.TXT','2.TXT'/ DO 10 NB=1,2 OPEN(10,FILE='A-A\output-'//DEF(NB)) 10 CONTINUE END というプログラムで出力すると、 A-Aというフォルダ内にoutput-1.txt、output-2.txtが作成されます。 これを発展させて、二つ以上のフォルダ内に出力する方法をいろいろ試したのですが、うまくいきません。 わかる方がいらっしゃれば、どうかご回答お願いいたします。 以下は、試したがうまくいかなかったプログラムです。 CHARACTER ABC(2)*5 CHARACTER DEF(2)*1 DATA ABC/'A','B'/ DATA DEF/'1.TXT','2.TXT'/ DO 20 NA=1,2 DO 10 NB=1,2 OPEN(10,FILE='A-'//ABC(NA)\output-'//DEF(NB)) 10 CONTINUE 20 CONTINUE END

専門家に質問してみよう