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はそうでないかも?

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

  • このエントリーをはてなブックマークに追加
関連キーワード
OS

SpecialPR

  • デジタル変革か?ゲームセットか?

    デジタルを駆使する破壊的なプレーヤーの出現、既存のビジネスモデルで競争力を持つプレイヤーはデジタル活用による変革が迫られている。これを読めばデジタル変革の全体像がわかる!

  • 「奉行シリーズ」の電話サポート革命!活用事例をご紹介

    「ナビダイヤル」の「トラフィックレポート」を利用したことで着信前のコール数や
    離脱数など、コールセンターのパフォーマンスをリアルタイムに把握するに成功。詳細はこちらから