2010年6月8日火曜日

split = 文字列を分割する - AWK

AWKの文字列操作関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 △(全角不可)Mawk △(全角不可)awk
文字列を分割します。

o 区切り文字を1文字だけ指定する時、処理系によって意味が変わります。
o 複数の環境でAWKを使う場合は、区切り文字 = aではなく、[a]もしくは[a\n]のように明示的に書く事をおすすめします。


**** 書式
--------
split( 分割対象文字列, 分割結果 [, 区切り文字] )
--------

o 分割対象文字列 -- 普通に指定します。
o 分割結果 -- 分割結果を入れる変数を指定します。配列になります。
o 区切り文字 -- 区切り文字や文字列です。
   + 正規表現なのですが、文字列の形で指定します。左右の「/」は付けず「"」で括ります。
   + 省略すると、変数 FSの値を使います。
   + 半角空白を1文字だけ指定すると、"[ \t\n]+"の指定と同じになります。
   + 区切り文字に「\」自身を指定する方法は、3種類あります。("\\"、"\\\\"、"[\\\\]")
      + "[\\]" はエラーになりますので、注意します。
o 戻り値 -- 分割結果の数

o 但し、全角文字を使うと、結果不正になる事のある処理系もありました。
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)


**** 使用例
--------
function  f_out(v_array, n, i) { # iは作業用変数です
  for (i = 1; i <= n; ++i) {
    print "out[" i "] = " v_array[i];
  }
}
BEGIN {
  print "# 'ミクさん', '', 'ミクさん'";
  out_num = split("ミクさんaaミクさん", out_array, "[a]");
  f_out(out_array, out_num);

  print "# FSが'[a]'の時も同じ。 'ミクさん', '', 'ミクさん'";
  FS="[a]";
  out_num = split("ミクさんaaミクさん", out_array);
  f_out(out_array, out_num);
}
--------

o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


**** 機能
o 指定した条件で、文字列を分割します。
o 分割条件の指定が無い時は、変数 FSの値を使います。
o 区切り文字に半角空白を1文字だけ指定すると、"[ \t\n]+"の指定と同じになります。
   + 変数FSの値を使う時も同じです。

o 文字列の代わりに数値を指定すると、数値を文字列に変換してから使用します。
   + 長い整数を指定すると、最後の方の桁が0になったり、浮動小数点形式になります。
   + 実数を指定すると、6桁までに丸めたり、浮動小数点形式になります。
   + この動作は変える事も出来ます。詳しくは、「数値から文字列にする時に、実数を7桁以上表示させる方法

** 処理系に依存する動作
o 次の処理系では、区切り文字を1文字だけ指定した時に、区切り文字に\nを追加して検索します。
   + 変数FSの値を使う時も同じです。
   + original = the one true awk(updated May 1, 2007)

o 以下の処理系では、全角文字を使うと結果不正になる事がありました。
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)
   例えば、split("ミク表さん", a, "\\"); の場合
      + Mawk for Windows 1.3.3 は、「表」の2バイト目で分割しました。
      + original = the one true awk(updated May 1, 2007)は、変数に入れた時点で「表」が文字化けしました。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3 -- 全角不可。関数が非対応
o original = the one true awk(updated May 1, 2007) -- 全角不可。処理系が非対応


==
関連ページ:
    ▼AWKの文字列操作関数と関連機能▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > sprintf = 文字列を組み立てる
    gsub = 文字列を置き換える
    sub = 文字列を、最初の1つだけ置き換える
    +
    FS = 読み込んだ行を列に分割する時の区切り文字
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
    文字列から文字を1つずつ取り出す
    substr = 文字列の一部を取り出す
    文字列を組み立てる
(2011年8月22日追加。「\」自身を指定する方法)
(2010年8月19日追加。確認した処理系を3つ追加)
(2010年6月10日追加。数値を指定した時の動作)