当ブログでは、goo-ブログアドバンスに契約してから、記事のバックアップを取れるようになりました。これは、記事とコメント等のテキストデータで、次のような一定の書式からなっています。
ここから、
という形式の記事一覧を抽出したい、というわけです。要するに、複行レコード形式のテキストデータから、目的のフィールドだけを抽出してレポートするには、という作業です。こういう作業には、awk 等が適しているでしょう。試してみました。
(1) 得られたバックアップを、narkejp-blog.txt というテキストファイル形式で保存し、テキストエディタで読み込んで元データを目視チェックしました。
(2) 都合上、ファイルの先頭に、半角スペース8個(--------)からなる行を追加挿入しておきます。これで、全部のレコードが同じデータ構造になります。
(3) インデントが崩れてしまいますが、日付とタイトル抽出のスクリプトは、
(3) これで、レコード中に narkejp という文字列を含むデータから、日付とタイトルの一覧を得るには、
のようにします。
(4) 同様の考え方で gooblog.awk を改変し、カテゴリー区分を追加したり、コメント数やTB数を添えたりする形に整理することもできます。また、行頭にレコード数を付加する(*3)のも良いかもしれません。
(*1): substr($4,7,10) は、第4フィールド($4:DATE)の7桁目から、MM/DD/YYYY という全10桁を帰す文字列関数。
(*2): substr($3,8) は、第3フィールド($3:TITLE)の第8桁目以降の文字列を帰す関数。
(*3):行頭にレコード数を追加するには、組み込み関数 NR を用いて、gooblog.awk の該当行を
のようにすれば、OK でしょう。
【追記】
日付の形式が MM/DD/YYYY という形式でした。また、goo ブログでは、バックスラッシュが消えてしまう仕様になっているようで、@ で代用し、注記することにしました。
--------
AUTHOR: narkejp
TITLE: ~記事のタイトル~
DATE: MM/DD/YYYY HH:MM:SS
PRIMARY CATEGORY: 記事のカテゴリー
STATUS: publish
ALLOW COMMENTS: コメント数
ALLOW PINGS: トラックバック数
CONVERT BREAKS:
-----
BODY:
本文~
-----
-------- (←レコードの区切り)
ここから、
MM/DD/YYYY 記事のタイトル~
という形式の記事一覧を抽出したい、というわけです。要するに、複行レコード形式のテキストデータから、目的のフィールドだけを抽出してレポートするには、という作業です。こういう作業には、awk 等が適しているでしょう。試してみました。
(1) 得られたバックアップを、narkejp-blog.txt というテキストファイル形式で保存し、テキストエディタで読み込んで元データを目視チェックしました。
(2) 都合上、ファイルの先頭に、半角スペース8個(--------)からなる行を追加挿入しておきます。これで、全部のレコードが同じデータ構造になります。
(3) インデントが崩れてしまいますが、日付とタイトル抽出のスクリプトは、
# gooblog.awk バックアップから日付とタイトルを抽出
# -- for awk/gawk/jgawk, 2010/07/07, narkejp
BEGIN {
RS="--------" # レコード区切子
FS="@n" # フィールド区切子
}
$2~/narkejp/ { # author名がnarkejpのもの
$4=substr($4,7,10) # 日付データの取得(*1)
$3=substr($3,8) # 記事タイトルの取得(*2)
print $4,$3 # 「日付 記事タイトル~」形式で出力
}
ただし、@をバックスラッシュに変える。
(3) これで、レコード中に narkejp という文字列を含むデータから、日付とタイトルの一覧を得るには、
(g)awk -f gooblog.awk narkejp-blog.txt > gootitle.txt
のようにします。
(4) 同様の考え方で gooblog.awk を改変し、カテゴリー区分を追加したり、コメント数やTB数を添えたりする形に整理することもできます。また、行頭にレコード数を付加する(*3)のも良いかもしれません。
(*1): substr($4,7,10) は、第4フィールド($4:DATE)の7桁目から、MM/DD/YYYY という全10桁を帰す文字列関数。
(*2): substr($3,8) は、第3フィールド($3:TITLE)の第8桁目以降の文字列を帰す関数。
(*3):行頭にレコード数を追加するには、組み込み関数 NR を用いて、gooblog.awk の該当行を
print NR,$4,$3 # 「番号 日付 記事タイトル~」形式で出力
のようにすれば、OK でしょう。
【追記】
日付の形式が MM/DD/YYYY という形式でした。また、goo ブログでは、バックスラッシュが消えてしまう仕様になっているようで、@ で代用し、注記することにしました。