テキストファイルから規則に則った行を抽出する方法

このQ&Aのポイント
  • テキストファイルから特定の規則に則った行を抽出する方法について教えてください。
  • UNIXのシェルプログラムを使用して、テキストファイルから特定の条件に合致する行を抽出する方法を教えてください。
  • テキストファイルから、特定の条件を満たす行のみを抽出するためのシェルスクリプトの作成方法を教えてください。
回答を見る
  • ベストアンサー

テキストファイルからある規則に則った行を抽出したい

UNIXのシェルプログラムについてご教示下さい。 当方、あるテキストファイルからある規則に則った行を抽出したいと考えています。 例えばテキストファイル内容が下記のようになっていたとします。 (分かりにくいと思いますが、イメージとしてはspiceのネットリストが該当します。) ~~~~~~~~~ Axxx aaaa aaaa Axxx bbbbbbbbbbb \ bbb BBB Bxxx cccccc ccccccc Bxxx dddddd dddd \ ddddddddddd Bxxx ee eeeee \ eeeeeeeeee \ eeeeeeee \ eeeee Bxxx XXX fffffff Bxxx ggg XXX Bxxx hhhhh XXX \ hhhhhhhhhh ~~~~~~~~~~~ この中から下記条件に沿うものを抽出したテキストファイルを作成したいです。 1. 「B」で始まる行を抽出する。 2. 1を満たし、「\」で改行される場合は、改行が続く限り抽出対象とする。 3. 1を満たしていても、「XXX」を含む場合は抽出対象外とする。 即ち、実現したいのは上記の結果から下記を得られるシェルスクリプトです。 ~~~~~~~~~ Bxxx cccccc ccccccc Bxxx dddddd dddd \ ddddddddddd Bxxx ee eeeee \ eeeeeeeeee \ eeeeeeee \ eeeee ~~~~~~~~~~~ 自身でもawkとgetlineで作ってみたのですが、上記に示す条件2を実現できず困っています。 ご回答に際しご不明な点がございましたら、その旨ご報告ください。 愚問で恐縮ですが、ご回答の程宜しくお願い致します。 # 急ぎの用件ですが、ご回答くださってもお礼を申し上げられるのは 最速で明日の夜となることを予めご承知おきください。

  • 8aki
  • お礼率100% (4/4)

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

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

[ANo.1] さんの条件を一部変更 「・↑について、Bで始まらなかったら次へ」 先頭の空白「 」とタブ「\t」が 0 回以上続いたあとに、Bで始まらなかったら次へ $ cat sed.txt :continue /\\$/{ N b continue } /^[ \t]*B/b candidate d :candidate /XXX/d $ sed -f sed.txt data.txt Bxxx cccccc ccccccc    Bxxx dddddd dddd \  ddddddddddd     Bxxx ee eeeee \ eeeeeeeeee \   eeeeeeee \ eeeee $

8aki
質問者

お礼

早急なご回答、ありがとうございました。 ご提示くださったスクリプトで、当方のやりたい事が実現できました。 併せて、相手に伝えるときには正確な条件提示が必要であることも 痛感致しました。 ありがとうございました。m(_"_)m

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

すみません。 awkでRSに指定したら、 $0に取り込まれないのを、うっかり失念してました。 GNU awkでRSに正規表現を使った場合、RSに一致した文字列が組み込み変数RTに設定されます。 なので、その例だったら awk 'BEGIN{RS = "([^\\\\])\n"} {l=$0 RT ; if (l !~ /XXX/ && $1 ~ /C/) {print l}}' text という感じでしょうか。$1の範囲にRTが含まれないとして。

8aki
質問者

お礼

ご回答ありがとうございました。 RS,RTを使用した文字列抽出のご教示もありがとうございました。 ご教示くださったスクリプトで、当方がやりたい処理が実現できることを 確認できました。ありがとうございます。 お世話になりました。m(_"_)m

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

この問題は、フィールドに分割する必要はないし、集計するわけでもないので、 awk じゃなくて sed で十分かも。 質問者さんの条件があいまいなので、 [ANo.1] さんの条件でかくね。 $ cat sed.txt :continue /\\$/{ N b continue } /^[^B]/d /XXX/d $ sed -f sed.txt inputdata.txt Bxxx cccccc ccccccc Bxxx dddddd dddd \ ddddddddddd Bxxx ee eeeee \ eeeeeeeeee \ eeeeeeee \ eeeee $

8aki
質問者

お礼

ご回答ありがとうございます。 当方の質問時の条件が曖昧だったようで申し訳ございません。 条件はご認識の通りです。 私が当サイトに送信した形式だと問題なく処理できることを確認しました。 ただ、実際には行の最初に数文字の空白が存在しており、 どうやらこの空白があるために「/^[^B]/d」が有効に働きません。 一応調査していくつかの空白とCを認識させるよう試みましたが、 どれもNGでした。 投稿時に行頭空白がなくなるようですので、「空白=△」で記載し直します。 良いご提案がございましたら、ご教示お願い致します。 因みに「△・・・△」は複数個(一定でない)を意図しています。 ~~~~~~~~~~~~~~~~~ △・・・△Axxx aaaa aaaa △・・・△Axxx bbbbbbbbbbb \ △・・・△bbb BBB △・・・△Cxxx dddddd dddd \ △・・・△ddddddddddd △・・・△Cxxx ee eeeee \ △・・・△eeeeeeeeee \ △・・・△eeeeeeee \ △・・・△eeeee △・・・△Cxxx XCKG fffff △・・・△Cxxx ggg XCKG △・・・△Cxxx hhhhh XCKG \ △・・・△hhhhhhhhhh ~~~~~~~~~~~~~~~~~~ 以上、宜しくお願い致します。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

・1行読み出す。 最後に\が付いていたらもう一行読み出して継げる。\がなくなるまで読み出す ・↑について、Bで始まらなかったら次へ ・↑について、XXXを含んでいたら次へ ・ここまで来るなら表示 という感じでしょうか。 GNU awkだとRSに正規表現が使えるので BEGIN{RS = "(^|[^\\\\])\n"} で\で継続する「1行」を取りだせるのですが.

8aki
質問者

お礼

ご回答ありがとうございます。 当方の質問内容が曖昧だったようで申し訳ございません。 期待する処理はご認識の通りです。 当方が作成していたコマンドライン入力からのコマンドに、 ご教示頂いた文を追加し実行したところ、ほぼ期待通りでした。 ほぼと言うのは、一部に問題があったことを意味しております。 問題とは、「\」で終了しない行の最後の文字が欠落する、と いうものです。 当方で作成したコマンドと切り分けて確認しましたが、 ご教示頂いた部分が影響しているように見受けられました。 最終的に実行したコマンドは以下です。 awk 'BEGIN{RS = "([^\\\\])\n"} {if ($0 !~ /XXX/ && $1 ~ /C/) {print $0}}' text 対策がお分かりになるようでしたらご教示願います。 以上、宜しくお願い致します。

関連するQ&A

  • C言語 ファイルの指定された行を表示

    こんにちは。 回答お願いします。 今私は作業の高効率化を目指すためプログラムを考えています。 まだぜんぜんできていませんが・・ ファイルの指定された行を表示する関数がないだろうか? もしくは似たような方法はないだろうかと考えています。 できれば例題とともに教えていただければ幸いです。 具体的にどういう風にしたいのかというと ----test.txt------- aaaa bbbbb cccccc dddd eeeeeeee ffffff ------------------- というファイルがあったとしたらgetsで4と入れてやったら 四行目のddddが表示されるようにしたいのです。 まだまだ初心者ですのでさっと考えることができません。 どうかご教授お願いします。

  • Excel抽出のマクロかVBAを教えてください

    A列にxxxがあった場合、その上に存在するIDの値を抽出する方法を教えていただけますでしょうか? 例)xxxがあった場合、IDの値を抽出したい。 以下の場合、ID:1111とID:3333と表示したい。 (ID以降の値はランダムです) A列 ID:1111 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff ID:2222 aaaa bbbb cccc dddd eeee ffffff ID:3333 aaaa bbbb cccc dddd eexxx ←xxxがあるのでその上のIDを抽出 ffffff

  • perlでの文字抽出

    はじめて質問させていただきます。 perlでの文字抽出について教えてください! ---------------------------- #c,aaaaa,0000 #c,bbbbb,00000 #c,bbbbb,0000 : #s,dddd,AAAA,xxxxx,yyyyy time,1 id, 1 type,1 : #e #s,eeee,AAAA,bbbb,cccccc time,2 id,2 type,2 : #e #s,fff,BBBB,zzzzzz,kkkkk time,1 id,1 type,1 : #e #s,eeeee,AAAA,rrr,qqqqqqqqq time,3 id,1 type,3 : #e : ---------------------------- のようなテキストファイルがあります。 #sから#eまでがひとくくりで、それが繰り返し出現し、それぞれの#sから#eまでの長さはバラバラです。 このとき、#sの行の3番目の要素がAAAAで、かつid,1となっているものについて、それぞれの要素を抽出しcsvファイルに ---------------------------- time   id    type 1     1     1 3     1     3 : ---------------------------- のように書き出したいのですが、perlのプログラムはどのようにしたらよいのでしょうか? ---------------------------- while(<INFILE>){  if(/^#s/../^#e/){   if(($_=~/AAAA/){    if($_=~/id,1/)){ : ---------------------------- とするとif(($_=~/AAAA/)で、#sの行しか抽出できないためid,1の検索が出来ず、行き詰ってしまいました。 perlを勉強し始めたばかりの超初心者で、質問が分かりにくいかと思いますが、よろしくお願いします。

  • テキストファイル→抽出した行をexcelに

    VBAで、下記のようなログファイルのテキストを読み込んで、必要な文字が含まれる行だけを、エクセルに書き込むコードを教えていただけると助かります。 読み込むファイルの例(実際は、数万行あります) (1行目)dammy.co.jp - - [01/Jan/2015:00:03:51 +0900] "GET /west/index.html      HTTP/1.0" 200 ..... (2行目)smotor.co.jp - - [01/Jan/2015:00:03:51        +0900] "GET /drink/orange/index.html HTTP/1.0" 200 ..... たとえば、/west/ が含まれる行だけを抽出して、excelシートに書き込みたい ログファイルは、改行コードがCRLFです。  どなたかお分かりになる方、お助けください。 当方、VBAは初心者なので、説明も加えていただけると非常に助かります。

  • perlを使用しての特定行抽出について

    何万行も書いてあるテキストファイルがあります。抽出したい文字列の一覧がテキストファイルにまとめられています(文字列は約1000個)。抽出したい文字列は一行にひとつづつ書かれています。何万行も書いてあるテキストファイルから抽出したい文字列と二つ合致したらその行を抽出したいです。ここで、注意していただきたいのが、抽出したい文字列一覧から二つの文字列にヒットした行を抽出したいです。宜しくお願い致します。 何万行も書いてあるテキストファイル aaaaa abc edi bb aert kkkkkkkkkk lllllll ddddd aaaaa anhi kkk    ・・・・・・・・ ・・・・・・・・ 抽出したい文字列一覧のテキストファイル aaaaa bbbbb ddddd iiiiiiiii eeeee ・・・・・ ・・・・・

    • ベストアンサー
    • Perl
  • テキストファイルから、一部の行を抽出したい

    下記のようなテキストファイルの中から、抽出したい行だけを指定して、取り出す方法はありますでしょうか。 テキストファイルの中身(部分) <h3 align="center">顧客名1</h3> <table><tr><td>ABC商事</td><td>鹿児島県</td></tr></table> <h3 align="center">顧客名2</h3> <p>出版</p> <br> <table> <tr><td>A株式会社</td><td>宮崎県</td></tr> ←抽出したい行 <tr><td>bb株式会社</td><td>長崎県</td></tr> ←抽出したい行 </table>   <p>教育</p> <br> <table>                      <tr><td>TT株式会社</td><td>鹿児島県</td></tr> ←抽出したい行 <tr><td>W株式会社</td><td>東京都</td></tr> ←抽出したい行 </table>                            <p>マスコミ<p> 以下省略 実際には、ファイルが大きく、抽出したい行が多いため、自動で処理できればと考えております。 VBAで作成できればと思っています。 <h3 align="center">顧客名2</h3> のあとに、<table>があれば、抽出を開始し、 </table> で、抽出をやめる、 また、<table>があれば、抽出を開始するということができればと 思うのですがよい方法がありましたら、ご教授いただければ幸いです。 よろしくお願いいたします。

  • テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】

    テキストファイルウィザードを使用したCSVファイル読み込みの挙動について【Excel2003】 <CSVファイル例> "aaaa","bbb<改行コード 0d0A>bb","ccc" 上記のようなCSVファイルを、 ダブルクリックにてExcel起動すれば正常に表示されますが、 テキストファイルウィザード(データ→外部データ取り込み→データの取り込み) を使用して、読み込みを行うと改行されて表示されてしまいます。 これは、Excelの仕様なのでしょうか? ご存知の方いらっしゃいましたら教えていただけますでしょうか? 現在の本質的な問題は、 ------------------------------------------------------------------- Excel2003にて、文字コードがUTF-8のCSVファイルを下記方法にて読み込む ・テキストファイルウィザードを使用 ・文字コードをUTF-8 ・カンマ区切り設定 で読み込みを行うと文字化けしないで表示されるのですが ダブルコーテーション中のデータ内に改行コード0d0aが含まれると 改行されてしまいます。 ------------------------------------------------------------------- と言う現象の調査をしております。

    • 締切済み
    • PHP
  • 改行区切りのテキストを1行ずつ読み込むシェルを作りたい

    awkにて改行区切りのテキストファイルを読み込みテキストファイルに記述されているファイルを別のフォルダへコピーしたいと考えております。 file1=コピー対象ファイル名が書かれたテキストファイル DIR1=コピー先ディレクトリ cat $file1 |gawk '{print "cp",$file1,$DIR1}'|sh 上記をシェルでで実行しようとすると下記のようなエラーで帰ってきてしまいます。 ⇒ cp: `****' と `****' は同じファイルです よい方法をご存知でしたらぜひ御教授いただけませんでしょうか。コピーが目的ですので別のコマンドでも結構です。

  • ファイル内の改行を削除し1行にするシェル

    お世話になっております。 ファイル(テキスト)内には、改行を含んだ複数の行が記述されています。 これを1行にして上書き保存するシェルを実行をするための シェルを作成したいと思っています。 ファイル内には以下のような値が改行を含んで入っています。 123 456 789 →これを、「123456789」と改行を取り除き、既存のファイルの上書き保存をしたい なお、改行を含んだ対象のファイルは、ファイル名にある文字を含む ファイルのみに対して行いたいのですが。 例:ファイル名に、「*abc*」、「*def*」、「*xyz*」を含むファイルが対象 改行を取り除くコマンドはわかるのですが、シェルにするプロセスがわかりません。 cat 入力ファイル名 | tr -d '\n' > 変換後の出力ファイル名 ご教授いただきたく、よろしくお願いします。

  • Accessのデータをテキストファイルで出力する方法を教えてください。

    Accessのデータをテキストファイルで出力する方法を教えてください。 クエリで抽出したデータをテキストファイルに出力したいのですが、下記のような記述では""や,で区切られてしまいます。 DoCmd.TransferText acExportDelim, "", "クエリ名", "出力ファイル.txt" フィールドごとに改行して出力する方法はないでしょうか? <クエリ結果> フィールド1  フィールド2  フィールド3 aaa      bbb      ccc <出力テキストファイル> aaa bbb ccc

専門家に質問してみよう