2010年9月7日火曜日

文字列から文字を1つずつ取り出す方法 - AWK

AWKの文字列操作関数と関連機能
AWKの文字列は、C言語とは異なり、配列の形で直接取り出す事は出来ません。
その代わり、処理系によっては、バイトを意識せずに文字を取り出す事が出来ます。

o 文字を1つずつ取り出す方法 -- substr関数を使います。
o 配列に入れてしまう方法 -- split関数を使います。


**** 手順
** 方法1. 文字を1つずつ取り出す方法
o substr関数を使います。
--------
BEGIN {
  v = "ミクさん";
  print "文字列「" v "」の文字分け結果";
  for (i = 1; i <= length(v); ++i) {
    print i " : " substr(v, i, 1); # 文字を1つずつ取り出します。
  }
}
--------

o 実行結果
--------
文字列「ミクさん」の文字分け結果
1 : ミ
2 : ク
3 : さ
4 : ん
--------

o Gawk以外で漢字などの全角文字を扱う時は、1バイトずつ取り出しますので、注意が必要です。
o 性能を気にするような使い方をする場合、length(v)の計算を for文の外に出すと、少し速くなりそうです。


** 方法2。配列に入れてしまう方法
o split関数を使います。
--------
BEGIN {
  v = "ミクさん";
  print "文字列「" v "」の文字分け結果";
  n = split(v, a, ""); # 区切り文字に、空文字を指定するのが、ポイントです。
  for (i = 1; i <= n; ++i) {
    print i " : " a[i];
  }
}
--------

o 実行結果
--------
文字列「ミクさん」の文字分け結果
1 : ミ
2 : ク
3 : さ
4 : ん
--------

o 「Gawkとmawk32」以外で漢字などの全角文字を扱う時は、1バイトずつ取り出しますので、注意が必要です。


==
関連ページ:
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > 文字列中で使用出来る特殊文字
    ツール。文字列からアスキーコードを調べます(String to ASCII)
    length = 文字列や配列の長さを調べる
    +
    substr = 文字列の一部を取り出す
    split = 文字列を分割する
    文字列を組み立てる