awk or perlが詳しい方ご教授下さい

OKWave 2007年07月31日 13時00分

  • このエントリーをはてなブックマークに追加
awk or perlが詳しい方ご教授下さい。

お世話になります。 下記のようなファイル内容があるとします。 (あくまでも例です。実際はもっと複雑です。)

この内容の大阪府に関する部分だけを抽出したいと思います。 抽出方法はawkで抽出行数を指定する方法を考えていますが、 得られている情報は「大阪府 end」の行数だけです。

「大阪府 start」の行数を取得出来れば目的は達成出来るのですが、 その方法が分かりません。

awkで指定行数から上方向に検索をかけるということは可能でしょうか? (下記例でいくと「大阪府 end」の行数から「大阪府 start」を検索し、 その行数を取得するということをやりたいです。) 可能であればその方法をご教授下さい。

awkで無理ならperlでの方法でも構いません。

(例)
●ファイルの中身
東京都 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
1000円
東京都 end
大阪府 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
10000円
大阪府 end
神奈川県 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
20000円
神奈川県 end
北海道 start
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
3000円
北海道 end
・
・
・
良回答

↓な感じの事をしたいという事? 今、手元にSolarisの環境がないからFreeBSDでの実行です。

%cat data
大阪府 start
淀川支店
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
10000円
大阪府 end
大阪府 start
天王寺支店
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
1000円
大阪府 end
大阪府 start
住吉支店
AAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBB
DDDDDDDDDDDDDDDDDDD
0円
大阪府 end

%cat sample.sh
#!/bin/sh

branch="$1"

datafile=data

sedopt=`awk -v Flag=0 '
/start$/{Start=NR}
/'${branch}'/{Flag=1}
/end$/{if(Flag){printf("%d,%dp",Start,NR);exit}}' ${datafile}`

sed -n ${sedopt} ${datafile}

%./sample.sh 天王寺支店
大阪府 start
天王寺支店
CCCCCCCCCCCCCCCCCCC
DDDDDDDDDDDDDDDDDDD
1000円
大阪府 end
回答

awkだけで片付けてみました。 start と end の行も出力したいのなら、コメントにしてある行を 使うようにしてください。

#!/usr/bin/awk
/^大阪府 start$/, /^大阪府 end$/ {
  if (/^大阪府 start$/)
    cnt=0

  data[cnt++] = $0

  if (/^大阪府 end$/ && exit_flag==1)
    exit(0)
  if (/^天王寺支店$/)
    exit_flag = 1
}
END {
  #for (i=0; i


支店のデータが巨大で配列に収められない場合でもできますが それはまたのお楽しみに。

POSIXのawkなら途中でexitしてもENDブロックを実行するはずですが、 ひょっとしたらSolarisのawkはそうでないかも?

そのときは適当にフラグを見て読み飛ばすなどしてください。

ZDNet Japan 記事を毎朝メールでまとめ読み(登録無料)

  • このエントリーをはてなブックマークに追加

この記事を読んだ方に

関連キーワード
OS

連載

CIO
ITアナリストが知る日本企業の「ITの盲点」
シェアリングエコノミーの衝撃
デジタル“失敗学”
コンサルティング現場のカラクリ
Rethink Internet:インターネット再考
インシデントをもたらすヒューマンエラー
トランザクションの今昔物語
エリック松永のデジタルIQ道場
研究現場から見たAI
Fintechの正体
米ZDNet編集長Larryの独り言
大木豊成「仕事で使うアップルのトリセツ」
山本雅史「ハードから読み解くITトレンド放談」
田中克己「展望2020年のIT企業」
松岡功「一言もの申す」
松岡功「今週の明言」
内山悟志「IT部門はどこに向かうのか」
林 雅之「デジタル未来からの手紙」
谷川耕一「エンプラITならこれは知っとけ」
大河原克行「エンプラ徒然」
内製化とユーザー体験の関係
「プロジェクトマネジメント」の解き方
ITは「ひみつ道具」の夢を見る
セキュリティ
エンドポイントセキュリティの4つの「基礎」
企業セキュリティの歩き方
サイバーセキュリティ未来考
ネットワークセキュリティの要諦
セキュリティの論点
スペシャル
エンタープライズAIの隆盛
インシュアテックで変わる保険業界
顧客は勝手に育たない--MAツール導入の心得
「ひとり情シス」の本当のところ
ざっくり解決!SNS担当者お悩み相談室
生産性向上に効くビジネスITツール最前線
ざっくりわかるSNSマーケティング入門
課題解決のためのUI/UX
誰もが開発者になる時代 ~業務システム開発の現場を行く~
「Windows 10」法人導入の手引き
ソフトウェア開発パラダイムの進化
エンタープライズトレンド
10の事情
座談会@ZDNet
Dr.津田のクラウドトップガン対談
Gartner Symposium
IBM World of Watson
de:code
Sapphire Now
VMworld
Microsoft WPC
Microsoft Connect()
HPE Discover
Oracle OpenWorld
Dell Technologies World
AWS re:Invent
AWS Summit
PTC LiveWorx
吉田行男「より賢く活用するためのOSS最新動向」
古賀政純「Dockerがもたらすビジネス変革」
中国ビジネス四方山話
ベトナムでビジネス
日本株展望
企業決算
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]