• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perl 複数ファイルから一行ずつ読み込んで比較)

Perl複数ファイルから一行ずつ読み込んで比較

kumozの回答

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

元のファイルの file1 と file2 の対応関係にズレはないということなので、1つの while ループで処理できると思います。 #!/usr/bin/perl use strict; use warnings; open IN_1, "file1" or die "Can't open file1: $!"; open IN_2, "file2" or die "Can't open file2: $!"; open OUT, ">output.txt" or die "Can't open output.txt: $!"; while (my $f1_line = <IN_1>) { $f1_line .= <IN_1>; my $f2_line = <IN_2>; $f2_line .= <IN_2>; next unless $f1_line =~ /\([\d.]+\)/; my ($num_1) = $f1_line =~ /\(([\d.]+)\)/; my ($num_2) = $f2_line =~ /\(([\d.]+)\)/; if (abs($num_1 - $num_2) >= 5) { # 5 とブロック内は適宜変更 print OUT $f1_line, $f2_line; } } close IN_1; close IN_2; close OUT;

kazumaxneo
質問者

お礼

お返事が遅くなってしまい、申し訳ありません。こまかい部分で、いくつか良く分からない部分がありましたので、先頭数百行でとりあえずサンプルファイルを作って、それでご連絡いただいたスクリプトを使って処理してみました。 結果からいうとうまく出力できました。いまだなぜこのように書くのか?不明な点はありますが、このような短い記述で、差があったtextファイルだけ出力できたので、大変驚いています。本当にありがとうございます。特に参考になったのは、perlを使える皆様には当たり前の話かもしれませんが 1、whileの中に、ファイルハンドルを宣言するならば、ひとつのファイルハンドルで複数のファイルを処理できる。当たり前かもしれませんがこの発想に頭がまったく回りませんでした。 2、nextとunlessを組み合わせて、正規表現でマッチしなければ、whileの処理をスキップする部分。 next unless $f1_line =~ /\([\d.]+\)/; 3、マッチすれば、それを次の処理につなげるためそのまま新変数に代入する my ($num_1) = $f1_line =~ /\(([\d.]+)\)/; 4、新変数の差を条件にif文を走らせる。 本当に勉強になりました。ひとつの疑問でいろいろと学べ、まことに感謝しております。お忙しい中、このような素晴らしい記述をご教授いただき、まことにありがとうございました。 ところで、後学のためにお時間ありましたらもうひとつだけ教えていただきたいのですが、while文の中で、再度$f1_lineを定義しているのはどういう意味があるのでしょうか?IN2もそうですが。 while (my $f1_line = <IN_1>) { $f1_line .= <IN_1>; また、その際、=でなく.=としているのはどういう意味があるのでしょうか?自分なりに検索して調べてみましたが、.=というものの意味を示す記述は見つかりませんでした。これが分かれば、この記述法は、完全に理解できると思うのですが、ここだけよく分かりません。

関連するQ&A

  • 二つのファイルから一行ずつ取り出して計算

    aaa.txt と bbb.txtというファイルがあり、それぞれ 1.1 0.1 -0.2 0.9 … といった感じで一行ずつ数値が入っています。 シェルスクリプトを用いて、 この二つのファイルから一行ずつ取り出して足し算を行いたい (例えばaaa.txtの一行目が1.1、bbb.txtの一行目が0.9なら1.1+0.9=2.0) のですが、どうすれば良いでしょうか。

  • 二つのファイルから一行ずつ取り出して計算

    aaa.txt と bbb.txtというファイルがあり、それぞれ 1.1 0.1 -0.2 0.9 … といった感じで一行ずつ数値が入っています。 C言語を用いて、上記ファイルを読み込み、 この二つのファイルから一行ずつ取り出して足し算を行いたい (例えばaaa.txtの一行目が1.1、bbb.txtの一行目が0.9なら1.1+0.9=2.0) のですが、どうすれば良いでしょうか。

  • perlをコマンドラインで実行したい

    今はperlをコマンドプロンプト上でファイルをコンパイルして実行結果を別のテキストファイルに出力しています。(printなど) ただ、こまごまとした置換え・変換などいちいちテキストファイルにperlを書いてコンパイルして出力ファイルを開いて取り出すというやり方にわずらわしさを感じてきました。 簡単なスクリプトであれば、使い捨ての方がよく感じており、 コマンドプロンプトで試してみたのですが、長い文章やソースなどを変数にいれることができず、(改行がEnterにとられてしまう??)また、一行にずらずらとかかなくてはならないので、うまくいきません。 なにか、テキストエディタのような感じで、このようなperlスクリプトをコンパイルできるようなものはあるのでしょうか。 copalというものを使ってみたのですが、 ファイルハンドルなどが使えなかったのでだめでした。 どなたかご協力お願いします。

    • ベストアンサー
    • Perl
  • テキスト比較コマンドのdiffについて

    unixコマンドにdiffというのがありますね。2つのテキストファイルを比較してその違いを出力するというものです。このコマンドの意味がわからないところがあります。 テキストAとBの比較とは、 1 両者が全く同じかどうかを比較するということなのか、 2 テキストAとBに含まれている各行を取り出してどこかに一致する行があるかどうかをチェックするということなのか 3 あるいはそれ以外の意味 どのようなことを意味するのでしょうか。 1だったら、1行付け加わっただけでそれ以降が同じものであったとしても全部検索対象となり出力されます。 2だったら、何をしたことになるのでしょうか。全く同じ内容で行構成を入れ替えたら検索に引っかからないことになります。 私の希望としては1なのですが、そうするとわけがわかなないぐらい多くの出力結果となることが多いはずです。オプションなどで対応するとは思いますが、基本的には何をするコマンドなのでしょうか。 よろしくお願いします。

  • 【FLASH】テキストファイルを一行ずつ表示させたい

    まだまだFLASH初心者のものです。 不可能な質問かもしれませんが、もしご存知の方がいらっしゃいましたら教えてください。 まず、私が実行したいことをいかに記載いたします。 ------------------------------------ 入力フォームより50文字程度のお知らせを投稿 ↓ ログファイル(log.txt)に一行ずつ投稿されたデータが記録される(最大10記録されます。) ↓ ログファイルのデータを一行ずつフラッシュで表示 (横に流れるニュースのようなかんじで) ------------------------------------ ログファイルの各行の最初に news1=書き込んだデータ1 &news2=書き込んだデータ2 というように変数を入れてあげれば、フラッシュで同じ変数を設定したテキストフィールドに反映させることはできるのですが、フォームから投稿したデータの場合、 書き込んだデータ1 書き込んだデータ2 と変数を頭につけることができません。 (フォームのスクリプト(php)で変数をつけて出力する方法も考えてみましたが常に最新の記事をnews1、ひとつ前の記事をnews2に変更して出力する方法がわからなかったので・・) もし、変数なしで一行ずつを表示させる方法をご存知の方がいらっしゃいましたら教えていただけますでしょうか。 また、ほかに良い方法がございましたらそちらも教えて頂ければと思います。

    • ベストアンサー
    • Flash
  • ファイルの処理について

    数百行のテキストファイルを5行づつ取り込んで処理をしたいのですが。。 どうすればいいのでしょうか? 一行づつは可能なんですが。。。 While(<FILEHANDL>){ 処理 } ヘルプ~。。。。

    • ベストアンサー
    • Perl
  • ファイルを行ごとに比較するシェルスクリプトについて

    ファイルを行ごとに比較するシェルスクリプトをご教授ください。 例えば(master.txt)(a.txt)(b.txt)(c.txt)(ok.txt)(ng.txt)と4つのファイルがあり、 (master.txt)と(a.txt)の行を比較し(a.txt)の中のある行が(master.txt)の行と一致した場合(ok.txt)に (master.txt)の行と一致しなかった場合(ng.txt)に入れる。 その後(master.txt)と(b.txt)の比較し(a.txt)が使用したものと同じ(ok.txt)or(ng.txt)に入れる・・・ といったように繰り返していくシェルスクリプトはどのようにして作成するのでしょうか? txtファイルの中の行はランダムに入っており、x.txtの一行一行ををmaster.txtの全行と比較する必要があります。 自分で作ってみたものは、while文を2重で使い一行ずつ取り出しcase文で行が一致した物を(ok.txt)に入れる 所までは成功しているのですが、複数回繰り返す時にどのようなロジックで不一致行を(ng.txt)に入れる ことができるのかが考え付きませんでした。 よろしくお願いいたします。

  • C++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、

    C++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、うまくできません! テキストには -3.0        1.0        2.0 ・・・などのように一行に一つの数値が入って縦に並んでいます。 それをひとつずつ読み込み、新しい配列(たとえばa[])に順番にいれたいのです。 a[1]=-3.0,a[2]=1.0、・・・と なるように。 どうか、この初心者にご指導お願いいたします。

  • バッチでテキストを出力したときに改行ができない

    バッチファイルでテキストを出力するのですが、改行ができません echo 一行目 > C:\temp.txt ? echo 二行目 >> C:\temp.txt として結果C:\temp.txtファイル内に  一行目  二行目 ではなく  一行目  二行目 としたいのですが、、 ?にはいるものがわかりません。 echo " " >> C:\temp.txt としても""が入ってしまうし echo   >> C:\temp.txt (全角スペース)を入れても"ECHO は <ON> です。"とメッセージが出てしまいます。 わかる方お願い致します。

  • ファイルのパターンマッチ処理の書き方

    現在Perlを勉強中です。 あるところからhtmlファイルをダウンロードした後、リンクを抽出する というスクリプトを、以下のように書いてみました。 (ファイルの各行について、「href="」と「"」の間にある、「"」以外が連続する部分を抽出する。 という考えです。) ----ここから------------------------------------------------- #!/usr/bin/perl ##################################################### #ここに、あるところから temp.htm をとってくる処理がある。# ##################################################### # temp.htm 中、 href でリンクされているページを出力 open ( FILE, "temp.htm"); while (<FILE>){ print ("$1\n") if /.*href="([^"]*.html)".*/; } ---ここまで-------------------------------------------------- この抽出部分はもっと簡潔に書けるものでしょうか? と言いますのは、これでも、Cに比べれば簡単なのですが、sedなら、 sed -n 's/.*href="\([^"]*.html\)".*/\1/p' temp.htm の1行で済むところなので、 一々ファイルを開いてwhileでまわすという書き方をするのが面倒だな と思いましたので質問させて頂きました。 (もっとも、sedはそのために特化したコマンドなので さすがにそれと同等に簡単に書けることを望むのが間違いなのかもしれませんが、 「簡単なことは簡単に...」がモットーのようなので、ひょっとしてという期待がありまして。。。) これは、私の書き方が冗長なのか、それとも、perlではこう書くのが普通なのか、 perlの勉強を始めたばかりで判断がつきません。 どちらなのかご教授いただけると幸です。 また、他にもこう書けるまたは私ならこう書くという御意見もお伺いできたら嬉しいです。 宜しくお願いします。

    • ベストアンサー
    • Perl