Hatena::ブログ(Diary)

日本 GNU AWK ユーザー会 0.2 このページをアンテナに追加 RSSフィード

2007-11-27

[]単語ごとに区切る

f:id:Rocco:20071005230453p:image:w100:right

ちょっと gawk の機能を使ってみたかったので作ってみました。

いわゆる文字クラスを用いているところと、まとめたい部分に故意に括弧をつけているあたりがポイントですかね。

いわゆる文であれば、コメントを冒頭に付けやすいのですが、関数の羅列だけど、全体である意味を成す場合にコメントが付けやすくなります。

#! /usr/bin/gawk -f
# usage: gawk -f split-words.awk 'phrases_within_single_quotes'
#   input:  phrase within single quotes (ARGV[1])
#   output: double quoted words

BEGIN {

    # section of spliting words
    {
        # add space top of upper cases
        ARGV[1] = gensub(/([[:upper:]]+)/, " \\1", "g", ARGV[1]);
        # remove unnecessary space
        sub(/ /, "", ARGV[1]);
        # split words
        n_argv = split(ARGV[1], a_argv, /[[:punct:][:space:]]+/);
    }

    # connect double quoted words
    for (i = 1; i <= n_argv; i++) {
        printf("\"%s\" ", a_argv[i]);
    }

    print "";
}

以下のような感じで split してくれます。

$ gawk -f split-words.awk 'Hello, World'
"Hello" "World"
$ gawk -f split-words.awk 'Hello, AWK'
"Hello" "AWK"
$ gawk -f split-words.awk 'Hello, WorldWideWeb'
"Hello" "World" "Wide" "Web"

[]単語頻度カウント

f:id:Rocco:20071005230453p:image:w100:right

経典をはじめ、多くの書籍では以下のような感じですかね。

{
    for (i = 1; i <= NF; i++) {
        count[$i]++;
    }
}
END {
    for (i in count) {
        print i ": " count[i];
    }
}

真面目にやるにはもう少し手を加えないとね。

ネットワーク越しの screen

うちは、TeraTermPro から EUC-JP 環境Zaurus接続して、Zaurus 上の screen から UTF-8 環境Fedorassh してますが、文字化けしませんね。つまり、「localhostscreen で encoding 変換」のケースに該当します。DBMS への接続はしていないので、その辺は不明です。