- ベストアンサー
テキストファイルから規則に則った行を抽出する方法
- テキストファイルから特定の規則に則った行を抽出する方法について教えてください。
- UNIXのシェルプログラムを使用して、テキストファイルから特定の条件に合致する行を抽出する方法を教えてください。
- テキストファイルから、特定の条件を満たす行のみを抽出するためのシェルスクリプトの作成方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
[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 $
その他の回答 (3)
- kmee
- ベストアンサー率55% (1857/3366)
すみません。 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が含まれないとして。
お礼
ご回答ありがとうございました。 RS,RTを使用した文字列抽出のご教示もありがとうございました。 ご教示くださったスクリプトで、当方がやりたい処理が実現できることを 確認できました。ありがとうございます。 お世話になりました。m(_"_)m
- dscripty
- ベストアンサー率51% (166/325)
この問題は、フィールドに分割する必要はないし、集計するわけでもないので、 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 $
お礼
ご回答ありがとうございます。 当方の質問時の条件が曖昧だったようで申し訳ございません。 条件はご認識の通りです。 私が当サイトに送信した形式だと問題なく処理できることを確認しました。 ただ、実際には行の最初に数文字の空白が存在しており、 どうやらこの空白があるために「/^[^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)
・1行読み出す。 最後に\が付いていたらもう一行読み出して継げる。\がなくなるまで読み出す ・↑について、Bで始まらなかったら次へ ・↑について、XXXを含んでいたら次へ ・ここまで来るなら表示 という感じでしょうか。 GNU awkだとRSに正規表現が使えるので BEGIN{RS = "(^|[^\\\\])\n"} で\で継続する「1行」を取りだせるのですが.
お礼
ご回答ありがとうございます。 当方の質問内容が曖昧だったようで申し訳ございません。 期待する処理はご認識の通りです。 当方が作成していたコマンドライン入力からのコマンドに、 ご教示頂いた文を追加し実行したところ、ほぼ期待通りでした。 ほぼと言うのは、一部に問題があったことを意味しております。 問題とは、「\」で終了しない行の最後の文字が欠落する、と いうものです。 当方で作成したコマンドと切り分けて確認しましたが、 ご教示頂いた部分が影響しているように見受けられました。 最終的に実行したコマンドは以下です。 awk 'BEGIN{RS = "([^\\\\])\n"} {if ($0 !~ /XXX/ && $1 ~ /C/) {print $0}}' text 対策がお分かりになるようでしたらご教示願います。 以上、宜しくお願い致します。
お礼
早急なご回答、ありがとうございました。 ご提示くださったスクリプトで、当方のやりたい事が実現できました。 併せて、相手に伝えるときには正確な条件提示が必要であることも 痛感致しました。 ありがとうございました。m(_"_)m