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日追加。数値を指定した時の動作)

2010年6月7日月曜日

substr = 文字列の一部を取り出す - AWK

AWKの文字列操作関数と関連機能
○(文字数)Gawk on Windows ○(文字数)Gawk ○(バイト数)mawk32 ○(バイト数)Mawk ○(バイト数)awk
文字列の一部を取り出します。


**** 書式
--------
substr( 対象文字列, 取り出し開始位置 [, 取り出す長さ] )
--------

o 対象文字列
o 取り出し開始位置 -- 先頭は 1 です。
   + 文字を数える時の単位は、処理系によって異なります。詳細は、下の通りです。
   + 負の値を指定しても、文字列の後ろから数える事はしません。JavaScriptとは異なります。
o 取り出す長さ -- 省略する事も出来ます。
   + 文字を数える時の単位は、処理系によって異なります。詳細は、下の通りです。
o 戻り値 -- 取り出した文字列

o 文字を数える時の単位は、処理系によって異なります。
   + (漢字などの全角文字が混じっている場合、長さが変わります。)
   + Gawk系は、文字数で数えます。
      + Gawk on Windows 3.1.7
      + Gawk for Windows 3.1.6
   + その他は、バイト数で数えます。
      + mawk MBCS (32bit版) 1.3.3
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)


**** 使用例
--------
BEGIN {
  print substr("ミクさん", 1); # ミクさん

  print substr("ミクさん", 1, 2); # ミク(or ミ)
  print substr("ミクさん", 3, 2); # さん(or ク)
  print substr(1.234, 1, 2); # 1.
}
--------

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


**** 機能
o 1番目の引数に指定した文字列から、部分文字列を取り出します。
o 1番目の引数に数値を指定すると、その数値を文字列とみなして、実行します。
o 長さを省略すると、開始位置から文字列の最後までを取り出します。
o 長さに 0以下の値を指定すると、結果は空("")になります。

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

** 処理系に依存する動作
o 文字を数える時の単位は、処理系によって異なります。
   + 文字数で数える処理系
      + Gawk on Windows 3.1.7
      + Gawk for Windows 3.1.6
   + バイト数で数える処理系
      + mawk MBCS (32bit版) 1.3.3
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)
o 開始位置に 0以下の値を指定して、長さも指定する場合、それなりに動くみたいです。
   + エラーメッセージは出ませんでした。


**** 確認した処理系
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
    ▼制作メモ
    > int = 実数や文字列を整数化する
    strtonum = 10進数、8進数、16進数の文字列を数値に変換する
    split = 文字列を分割する
    +
    文字列から文字を1つずつ取り出す
    文字列を組み立てる
(2010年6月10日追加。数値を指定した時の動作)

2010年6月6日日曜日

atan2 = 逆正接を求める - AWK

AWKの数値計算関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
逆正接(arctan = 三角関数のアークタンジェント)を求めます。
(平面座標の2つの値(y, x)を指定して、角度を求めます。)

**** 書式
--------
atan2( y座標の値, x座標の値 )
--------

指定する 2つの値の単位は、同じであれば何でも OKです。
o y -- 数値。文字列を指定する事も出来ます(例:"39.39だよ")。
o x -- 数値。文字列を指定する事も出来ます(例:"39.39だよ")。
o 戻り値 -- 計算結果。角度です。(単位はラジアン


**** 使用例
--------
BEGIN {
  print atan2(3,9); # 0.321751

  print "# 以下、計算結果の確認です。";
  print atan2(3.3, 9.9); # 0.321751
  print atan2("          3","          9"); # 0.321751
  print atan2("3aaa","9aaa"); # 0.321751
  print atan2("aaa3", "aaa9"); # 0
}
--------

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


**** 機能
o 数値であると解釈して、逆正接を求めます。計算結果の値の単位はラジアンです。
o 計算結果が0となる辺りでは、誤差が上位桁に登場します。乗算などを行う時は要注意です。

o 数値は、文字列の形で指定する事も出来ます。
o 数値の後ろに文字列が続いていても、大丈夫です。
o 先頭に数値以外の文字がある場合
   + 半角空白は読み飛ばします。
   + それ以外の文字があると、0 だと解釈します。


**** 確認した処理系
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
    ▼制作メモ
    > ラジアンの意味
    log = 自然対数(ln)を求める
    exp = 指数関数を求める
    +
    sin = 正弦を求める
    cos = 余弦を求める
(2010年6月12日追加。オリジナルawkなどの動作)