なぜ「はてダ」を使うか?

実は「日本 GNU AWK ユーザー会」と言われている Web サイトはいくつかあります。

ひとつは私の個人運用の http://gauc.no-ip.org/ です。途中までは良く回っていたのですが、サーバーのメンテコストとスパムの荒らしのため、基本認証で回避していますが、これが逆に間口を狭くしてしまっています。Wiki を使うのはまずまず成功だったと思います。

もうひとつは Google グループGoogle Group を使って、メールのやりとりで進めようとしたものです。実際には 日本 GNU AWK ユーザー会 ML|freeml byGMO の ML ですら閑古鳥が鳴いている状態ですから、結果的にうまく行っていません。

もうひとつは、LLイベントドメインのとおり、LL カンファレンスのページです。最初は結構書いていたのですが、このページの性質上 1 ページにして、おしまい。(間借りしたい気持ちはありますけど)

もうひとつは、日本 GNU AWK ユーザー会 0.2 で、つまり、ここです。今はここで落ち着いています。では、なぜ「はてなダイアリー」を使っているのかと言うと、

  • 小さなコミュニティではトラフィックが少なく、開発者や主導者が牽引するだけになっている
    • 個人的なページでもいいやん (w
  • Wiki は便利だけど、どうしても散在してしまい、Wiki を時々うまく整理していく必要がありました
    • Blog なら時系列で必ず並ぶでしょう。さらに「はてダ」はタグが使えます
  • Emacs などから書き込める
    • これは非常に便利です
  • ネタを絶やさない
    • つまり、小さなコミュニティはネタを書きやすいところに書いていかないと、なくなってしまうので、Blog のような形式は比較的継続的なリアルタイムの情報を書きやすいです
  • トラップされやすい
    • さすが「はてダ」です。最初に書いた 私の個人運用の http://gauc.no-ip.org/ なんかを数日でアクセス数を突破しています (w
  • メンテナンスがいらない
    • 容量は何 MB までだっけ・・・という心配はありますが、Emacs + simple-hatena-mode ですから、私のローカルには保存されていますので、復活させることもできます。
  • コードがカラーリングされる
    • awk もカラーリングされます

小さな話題をたくさん書いていますが、awk の最新の情報だけでも結構な量があることが分かると思います。ブログは死にゆく技術か? | スラド といった記事も最近ありましたけど、Blog というスタイルはうまく使うと幅が広がってきそうなので、もう少し可能性を探っていきたいと考えています。

脳裏によぎった言葉

お客様、恐れ入りますが、その会員情報はお教えできません。


英語だとやっぱり「I'm afraid I can't do that.」だよなぁ。でも、この台詞を言われた方がゾクゾクと怖くなるのは私だけではないはず。

マッチしたパターンの後のユニークなもの


入力ファイルが、

str1 str2 str3 str4  err003 str5 str...N
str1 str2 str3 str4  str5 err002 str5 str...N
str1 str2 err003 str3 str...N
str1 str2 str3  err002 str4 str...N

のようなものの時に、/err[1-9]/ にマッチするものを抜き出して、同じ err No. のものを無視すると言うものらしいです。(質問の意図がイマイチ把握できていません)

awk '
   match($0,/err[0-9]+/) { e=substr($0,RSTART,RLENGTH) }
   !(e in err) { err[e]; print substr($0,RSTART+3) }
'

で所望のものらしいので、そういうことなのですが、アクションの評価式で !(e in err) という記法は珍しいかもしれません。

パターンにマッチするまで表示する


質問はタイトルのとおりですが、答えは以下のとおりです。

NR==1,/endpat/

ゴルフにも使えそうな内容ですね。

1,/endpat/

の挙動は違うという話に発展していますが、これは最初の '1' で台無しになっています。結果的に全て表示になってしまいます。

配列数を数える


私もはじめて知ったりしましたが、

$ gawk 'BEGIN {split("the quick brown fox",A);print "Number ofelements:",length(A)}'
Number ofelements: 4

でできたんですね。orz

Sun Jun 26 16:37:59 2005  Arnold D. Robbins  <arn...@skeeve.com>

        Unrelated changes:

        * builtin.c (do_length): Allow array argument to length().
          Returns number of elements in array.

兼用できる場合には、split() とか、asort() とかも有効な手段だと思います。

フィールドの削除


なんか最近見かけた話題ですが、

$ echo fld1 fld2 fld3 fld4 fld5 | awk '{$1=$2=""; print}'
   fld3 fld4 fld5

の先頭のスペースが邪魔ということですが、これはフィールドが削除できていないのではなく、FS が出力されているだけです。

Ed Morton の

gawk --re-interval 'sub(/^[[:space:]]*([^[:space:]]*[[:space:]]*){N}/,"")'

という回答もどうかと思います。
個人的には sub() を付けるか、printf() を使いますけどね。

文字列の置換


以下のような置換を行いたいと最初書いていましたが、Ed が怒るのも当然で、実際には少し異なります。

xxxxA      ->     xxxxBC
xxxAxxxx   ->     xxxBxxxxC

なんだか良く分からない 'A' という文字列を 'B' にして最後に 'C' を付けることのようです。

したがって、以下のようなものが回答でした。

BEGIN { OFS = FS = "\t" }
{ for (i = 1; i <= NF; ++i) {
    if ($i ~ /A/) {
      gsub(/A/, "B", $i)
      $i = $i "C"
}  }  }

1

最後の '1' は常に True の意味での '1' です。

C から入った人の疑問 (なのかな?)


以下のような awk スクリプトが動作しないそうです。

function extract(str,regexp)
{ RMATCH = (match(str,regexp) ? substr(str,RSTART,RLENGTH) : "")
   return RSTART

}

extract($0,*@lobogris2) { print RMATCH }

さて、どこが怪しいでしょうか?

要するにキモは以下の部分でしたというオチです。

extract($0,".*@cofeerd1b") { print RMATCH }