• ベストアンサー

dataファイルの特定の行から特定の行をダンプさせるには?

$ cat data.txt #No1. abc... #No2. def... #No3. ghi... #No4. jkl... #No5. mno... なるデータの、例えば#No2.から#No4.までのデータだけをダンプするのに、 open(IN,"data.txt"); my $flag=0; while(<IN>){ if ( $_ =~ /#No2./ && $flag == 0) { $flag=1; } if ( $_ =~ /#No5./ && $flag == 1) { $flag=0; } print if $flag==1; } close(IN) と書いてみましたが、もっと簡単に書く方法を以前見たことがあったように思うのですが、こう書けばよいのでは?というアイディアがあれば、ご教授いただけないでしょうか?

  • Perl
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

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

少なくとも if (/#No2./ && $flag == 0) { $flag = 1; } if (/#No5./ && $flag == 1) { $flag = 0; } は $flag = 1 if /#No2./; $flag = 0 if /#No5./; にできますね. あと, #No5 を出力していいなら while の中身を print if /#No2./ .. /#No5./; で置き換えることもできます. while (<IN>) { push(@lines, $_) if /#No2./ .. /#No5./; } print @lines[0 .. ($#lines-1)]; のように配列にして逃げることもできる... かな.

HoComeCome
質問者

お礼

>あと, #No5 を出力していいなら while の中身を print if /#No2./ .. /#No5./; で置き換えることもできます. 御回答ありがとうございます。 私の記憶にあったものはたしか、これです。

その他の回答 (2)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.3

ANo.1の方の $flag = 1 if /#No2./; $flag = 0 if /#No5./; の記述は、更に短くして $flag ^=1 if /#No2\.|#No5\./; という風にできますね。

HoComeCome
質問者

お礼

$flag ^=1 if /#No2\.|#No5\./; のような書き方は初めて見ました。 参考になりました。ありがとうございます。

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

例に書いてあるプログラムと同じ出力でいいのなら、 open(IN,"data.txt"); while(<IN>){ if(/#No2\./ .. /#No5\./){print;} } close(IN);

HoComeCome
質問者

お礼

御回答ありがとうございます。 No1の方と同様、 if(/#No2\./ .. /#No5\./){print;} この書き方が私の記憶にあったものです。 違う方から同じ解答がいただけ、確信できました。 ありがとうございました。

関連するQ&A

  • データをブロックごとに並べ替えるスクリプト

    データをブロックごとに移動して並べ替えたいのですが、 うまくいくスクリプトが書けず困っています。 APR_A----- abc 1 def 2 APR_B----- abc 3 def 4 APR_C----- abc 5 def 6 APR_A----- ghi 1 jkl 2 mno 3 APR_B----- ghi 4 jkl 5 mno 6 APR_C----- ghi 7 jkl 8 mno 9 のようなフォーマットのデータがあります。 これを以下のようにフォーマットを変えたいのですが、 awkを使ってどのようにスクリプトを書いたらよいでしょうか。 元データの中で、区切りの行は常にAPR_で始まっています。 APR_で始まる行に来たら次の列に移って2列目のみprint というのを繰り返し、APR_Aに戻ってきたら、 1列目(abc,defなど)、2列目ともprintして同様に繰り返す。 各ブロックの行数はまちまちです。(最初のブロックのように2行のブロックもあれば2番目のブロックのように3行のもあります) rowtitle APR_A APR_B APR_C abc 1 3 5 def 2 4 6 ghi 1 4 7 jkl 2 5 8 mno 3 6 9 分かりにくい文章ですが、理解していただけることを願っています。 よろしくお願いします。

  • エクセルで,スペースのある文字列を列ごとに分けるには?

    例えば abc def ghi jkl mno pqr という文章があったとします。 それを |abc|def|ghi| ------------- |jkl|mno|pqr| みたく,スペースのあるところで区切るにはどのようにすればよいでしょうか。教えてください。

  • シュワルツ変換の不具合

    シュワルツ変換の不具合で困っています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1959574 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1882190 で質問したものです。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; &hoge; sub hoge{ open(o,"hoge.txt"); @all = <o>; close(o); for (@all){ ($sentence,$filename) = split(/,/,$_); $score++; push @hoge, ($score,$_,"<br>\n"); } @hoge = map {$_->[0]} sort {$b->[1] <=> $a->[1]} map {[$_, split /,/]}@hoge; print @hoge; } というcgiを作成し、実行してみたのですが望んだ処理が出来ません。 hoge.txtは ,123,abc.txt ,456,def.txt ,789,ghi.txt ,123,jkl.txt ,456,mno.txt ,789,pqr.txt という内容です。 cgiを実行すると 6 5 4 3 2 1 ,789,pqr.txt ,456,mno.txt ,123,jkl.txt ,789,ghi.txt ,456,def.txt ,123,abc.txt となってしまいスコアが先頭に集まってしまいます。 シュワルツ変換の行を削除すると 6,789,pqr.txt 5,456,mno.txt 4,123,jkl.txt 3,789,ghi.txt 2,456,def.txt 1,123,abc.txt こうなるのですが、これをシュワルツ変換を用いて 1,123,abc.txt 2,456,def.txt 3,789,ghi.txt 4,123,jkl.txt 5,456,mno.txt 6,789,pqr.txt と出力させたいのです。 どこをどのように変えればよいでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • テキストデータ(文字)のブロック移動

    説明しにくいのですが 例えば、下のような データがあるとします。 データ1 001 002 003 004 005 006 007 008 データ2 ABC DEF GHI JKL MNO PQR STU VWX この二つのデータを 001ABC 002DEF 003GHI 004JKL 005MNO 006PQR 007STU 008VWX のように、横にひっつける事は メモ帳では容易にできませんが メモ帳程度で(上がっててもあまり メモリやリソースを食わない もので、機能もごてごてしていなくて でも一太郎のように、ブロックで囲み 移動、複写、など簡単に行える フリーソフトなどないでしょうか? エクセルの機能を使って、ひっつけたり しているのですが、なにぶん面倒で、 ワードでも無理みたいな感じですし しかも、メモリをたくさん使うし 一太郎は入ってないですし、入れたくもないし・・・ ワードでも無理みたいな感じですし そのままTXTとして保存できないし・・・・ 心当たりをご存じの方おねがいします。

  • オープンしたファイルで行の連結

    はじめまして、言語に疎いもので質問させて頂きます。 次のようなsample.txtというファイルがあります。 【sample.txt】 ABC #1行目 <タブ>DEF #2行目 行頭にタブ <タブ>GHI #3行目 行頭にタブ JKL #4行目 <タブ>MNO #5行目 行頭にタブ PQR #6行目 <タブ>STU #7行目 行頭にタブ <タブ>VWX #8行目 行頭にタブ (・・・以下上記のような2、3行のブロックパターンがランダムで続く) 1~3行目を1ブロック、また4~5行目、6~8行目を一部ロックとして 半角スペースを間に挟んで一行に連結し、下のように別ファイルに出力したいと考えております。 【output.txt】 ABC DEF GHI JKL MNO PQR STU VWX ファイル自体は次のようにopen関数で開き、一行ずつ読み込んでいますが、現在の行を読みつつ、 次の行の内容をどうしたら読むことができるかわかりません。 また行の連結はどのように行えばよいでしょうか。 2、3行のブロックパターンがランダムで続くため、次の行の先頭にタブがあれば連結するという 処理も加えたいと考えております。 open(IN, $sample.txt); while (<IN>) {    $line = <IN>; } 質問内容もわかり辛いかと思いますがご教授頂けますでしょうか。

    • ベストアンサー
    • Perl
  • perlかベクターなどのフリーウェアでこれはできますか?

    1.txt abc def ghi jkl mno pqr stu 2.txt mno abc 123 900 456 def stu qqq プログラム 1.txtと2.txtを比べて、1.txtに無い文字を3.txtへ書き出す。 3.txt 123 456 900 qqq Excelなら分割して何度かソートとIFを使えば解決できなくも無いのですが、今回は、行数が100万行を超えているため現実問題として無理です。 そこで、perlで行いたいのですがどのようにすればできますか? 良い方法が思いつきません。。。 どなたか、教えていただけないでしょうか? もしくは、これを解決するためのフリーウェアなどあればとても、助かります。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • excelの重複データの削除方法。

    excel2003で重複する値を自動的に削除する方法を探しています。 現在、以下のような手順で作業をしています。     A   B   C 1 ○○○ 100 ABC 2 ▼▼▼ 200 DEF 3 ◇◇◇ 300 GHI 4 ■■■ 400 JKL 5 △△△ 500 MNO ↑の元データに      A   B   C 1 ○○● 100 ABC 2 ◇◆◇ 300 GHI ↑のデータを追加(貼り付け)して並び替えをすると      A   B   C 1 ○○○ 100 ABC 2 ○○● 100 ABC 3 ▼▼▼ 200 DEF 4 ◇◇◇ 300 GHI 5 ◇◆◇ 300 GHI 6 ■■■ 400 JKL 7 △△△ 500 MNO というデータが出来るとします。 「C列の値を基準」として、重複している箇所を検出・削除し (上の例で言えば、1・2・4・5の行。)      A   B   C 1 ▼▼▼ 200 DEF 2 ■■■ 400 JKL 3 △△△ 500 MNO というデータにしたいと考えております。 重複した値のどちらか一方を残す、という方法ではなく、 重複した値の全てを削除する、という方法が解りません。 手作業で1つ1つ削除していけばいいのですが、本物のデータは何千件とあるので 手作業では時間が掛かりすぎてしまいますので…。なにかよい方法はないでしょうか? 簡単な方法であれば大変助かりますが、マクロなどを使用する方法でもかまいませんのでご教授下さい。 よろしくお願い致します。

  • 秀丸の検索・置換の正規表現の最短一致の挙動が変です

    秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz の先頭にカーソルを置いた状態で、 (質問1) 正規表現のチェックボックスをチェックして /.*$ で検索すると /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (/abc/.*$とするとカーソルがある /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz ではなく次の行以降の /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます?) (質問2) 正規表現のチェックボックスをチェックして /.*?$ で検索すると最短一致となるため /uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (なお、/[^/]*$では/uvw.xyzが検索されます)

  • PHP 配列について

    PHPで簡単なプログラムを作っています。 上手い方法があれば教えてください。 例えば $arr = array(); $arr(0) = "ABC"; $arr(1) = "DEF"; $arr(2) = "GHI"; $arr(3) = "JKL"; $arr(4) = "MNO"; この様な配列があり、これを以下の様に「特定のデータを削除し空いているキーを詰めたい」場合どうしたら良いのでしょうか? この場合は"DEF"を削除。 $arr(0) = "ABC"; $arr(1) = "GHI"; $arr(2) = "JKL"; $arr(3) = "MNO"; アドバイスお願いします。

    • ベストアンサー
    • PHP
  • バッチファイルでファイルを比較後他のフォルダにコピ

    次のようなファイル構成で C:\AAA     C:\BBB   \ccc      \ccc    abc.txt    abc.txt    def.jpg    def.jpg   \ddd      \ddd    ghi.txt    ghi.txt    jkl.jpg    jkl.jpg C:AAA\ccc\abc.txt と C:BBB\ccc\abc.txt を比較 C:AAA\ccc\def.jpg と C:BBB\ccc\def.jpg を比較 C:AAA\ddd\ghi.txt と C:BBB\ddd\ghi.txt を比較 C:AAA\ddd\jkl.jpg と C:BBB\ddd\jkl.jpg を比較 全てのファイルに対し比較後C:\CCC(別のフォルダ)に階層を含めコピーしたく for /R %%A in ("C:\AAA") do for /R %%B in ("C:\BBB") do if %%~zA NEQ %%~zB (goto A) :A echo NEQ としましたがループしてしまいました 比較後C:\CCC(別のフォルダ)に階層を含めコピーする方法も含め ご教授をい願いします

専門家に質問してみよう