2010年6月9日水曜日

AWKの文字列操作関数と関連機能 - AWK

AWKの関数、変数、制御文
**** 文字列操作の手引き
文字列操作関数使用時の注意点まとめ
文字列を組み立てる
   + 速度比較。文字列の組み立て
文字列から文字を1つずつ取り出す
文字列中で使用出来る特殊文字
▼正規表現
ツール。文字列からアスキーコードを調べます(String to ASCII)


**** 組み込み関数
o 調べる
length = 文字列や配列の長さを調べる
index = 文字列の登場位置を調べる
match = 正規表現の登場位置を調べる

o 取り出す
substr = 文字列の一部を取り出す
int = 実数や文字列を整数化する
strtonum = 10進数、8進数、16進数の文字列を数値に変換する(Gawk専用)
split = 文字列を分割する
patsplit = 文字列を分割する。FPAT版(Gawk専用。バージョン4以降)
sprintf = 文字列を組み立てる

o 置き換える
gsub = 文字列を置き換える
sub = 文字列を、最初の1つだけ置き換える
gensub = n番目に見つかった文字列を置き換える(Gawk専用)
toupper = アルファベットを大文字にする
tolower = アルファベットを小文字にする


**** 関係する変数
o 更新する値
$0 = 最後に入力したデータ、1行分。対象文字列の指定が無い時に、使われる事があります。
RSTART = match関数で見つけた文字列の先頭位置
RLENGTH = match関数で見つけた文字列の長さ

o 文字列操作する為に使う値
FS = 分割する時の区切り文字。split関数で区切り文字の指定が無い時に、使われます。
FPAT = 分割する時の列取り出し規則。patsplit関数で区切り文字の指定が無い時に、使われます。(Gawk専用。バージョン4以降)
OFMT = printを使って数値1つだけを書き出す時の書式
CONVFMT = 数値を文字列に自動変換する時の書式
IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)


**** 関係する演算子
o 代入
=   = 代入

o 結合
(空白を入れて並べて書くと結合) = A B C と書くと、変数Aと変数Bと変数Cを文字列として結合

o 比較
==  = 等しい時に真。比較の時は、等号を2つ並べます。
!=  = 等しくない時に真
~  = 左辺の中に、右辺の正規表現に一致する部分がある時に真
!~  = 左辺の中に、右辺の正規表現に一致する部分が無い時に真
>   = 左辺よりも大きい時に真
>=  = 左辺よりも大きいか、等しい時に真
<   = 左辺よりも小さい時に真
<=  = 左辺よりも小さいか、等しい時に真

o 条件演算
?:  = A ? B : Cの形。条件Aによって、どちらか1つの値を取ります。


文字列操作機能サポート状況
名前Gawk on
Windows
3.1.7
Gawk for
Windows
3.1.6
mawk32
1.3.3
Mawk for
Windows
1.3.3
awk
(May 1,
2007)
説明
調べる  
length
(文字数)

(文字数)

(バイト数)

(バイト数)

(バイト数)
文字列や配列の長さを調べる
index
(文字数)

(文字数)

(バイト数)

(全角不可)

(全角不可)
文字列の登場位置を調べる
match
(文字数)

(文字数)

(バイト数)

(全角不可)

(全角不可)
正規表現の登場位置を調べる
取り出す  
substr
(文字数)

(文字数)

(バイト数)

(バイト数)

(バイト数)
文字列の一部を取り出す
int実数や文字列を整数化する
strtonum×××10進数、8進数、16進数の文字列を数値に変換する
split
(全角不可)

(全角不可)
文字列を分割する
sprintf
(全角不可)
文字列を組み立てる
置き換える  
gsub
(全角不可)

(全角不可)
文字列を置き換える
sub
(全角不可)

(全角不可)
文字列を、最初の1つだけ置き換える
gensub×××n番目に見つかった文字列を置き換える
toupper
(全角不可)

(全角不可)
アルファベットを大文字にする
tolowerアルファベットを小文字にする
変数。更新する値  
$0最後に入力したデータ、1行分。対象文字列の指定が無い時に、使われる事があります。
RSTART
(バイト数)

(バイト数)

(バイト数)
match関数で見つけた文字列の先頭位置
RLENGTH
(バイト数)

(バイト数)

(バイト数)
match関数で見つけた文字列の長さ
変数。文字列操作する為に使う値 
FS分割する時の区切り文字。split関数で区切り文字の指定が無い時に、使われます。
OFMTprintを使って数値1つだけを書き出す時の書式
CONVFMT数値を文字列に自動変換する時の書式
IGNORECASE×××文字列比較で大文字小文字を区別させない


==
関連ページ:
    ▼AWKの関数、変数、制御文▼ABC順
    ▼AWKプログラムを書く
    ▼AWK
    ▼制作メモ
    > ▼AWKの時刻取得関数と関連機能
    ▼AWKの入出力関数とコマンド実行機能
    ▼AWKのインターネット接続機能(Gawk専用)
    +
    ▼AWKの配列操作関数と関連機能
    ▼AWKの数値計算関数と関連機能
    ▼AWKのパターンと制御文

sub = 文字列を、最初の1つだけ置き換える - AWK

AWKの文字列操作関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 △(全角不可)Mawk △(全角不可)awk
文字列を、最初の1つだけ置き換えます。

o 対象文字列を直接変更しますので、必要な時は、値をコピーしてから使います。
o 見つかった文字列を全部置き換える時は、「gsub = 文字列を置き換える


**** 書式
--------
sub( 置換する条件, 置換後の文字列 [, 対象文字列] )
--------

o 置換する条件 -- 正規表現で指定します。左右の/を付けます。例: /ミク/
o 置換後の文字列 -- こちらは、普通の文字列を指定します。例: "Miku"
   + 但し、文字「&」(と「\」)について特例があります。
   + 「&」は正規表現で見つかった文字列に置き換えます。「&」に変換したい時は「\\&」を使います。
   + 「\」は、特殊文字を示す文字です。「\」に変換したい時は「\\」を使います。
o 対象文字列 -- 指定した文字列を直接変更します。省略すると、変数 $0を使います。
o 戻り値 -- 置換した数
   + 0 もしくは 1 になります。

o 文字列を指定する所は、数値も指定出来ます。
   + 6桁を超える数値を指定する時は、数値から文字列に自動変換する時の最大桁数を増やします。
   + (変数CONVFMTを使用)
o なお、全角文字を使うと、結果不正になる事のある処理系もありました。ご注意下さい。
   + Mawk for Windows 1.3.3
   + original = the one true awk(updated May 1, 2007)


**** 使用例
--------
BEGIN {
  v = "ミクさん、みくさん、ミクさん。";
  n = sub(/ミク/, "Miku", v); # Mikuさん、みくさん、ミクさん。
  print v;
  print n "個を置き換えました。";

  v = "39.39139";
  n = gsub(/39/, "ミク", v); # ミク.39139
  print v;
  print n "個を置き換えました。";

  v = 39.39139; # 数値の場合
  n = sub(/39/, "ミク", v); # ミク.3914
  print v;
  print n "個を置き換えました。";
}
{
  n = sub(/ミク/, "Miku"); # 対象文字列の指定が無い時は、$0を置換します。
  print $0;
  print n "個を置き換えました。";
}
--------

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


**** 機能
o 指定した条件で、文字列や数値を1箇所だけ置き換えます。
o 対象文字列を直接変更します。
o 対象文字列を省略すると、変数 $0を使います。
o 見つかった所を1箇所だけ置き換えて、置き換えた数を返します。

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

** 処理系に依存する動作
o 以下の処理系では、全角文字を使うと結果不正になる事がありました。
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)
o 例えば、v = "表ミクさん表表ミクさん\\aa"; sub(/\\/, "x", v); で正しい結果になりません。
      + 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
    ▼制作メモ
    > gensub = n番目に見つかった文字列を置き換える
    toupper = アルファベットを大文字にする
    tolower = アルファベットを小文字にする
    +
    gsub = 文字列を置き換える
    CONVFMT = 数値を文字列に自動変換する時の書式
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
(2010年8月23日追加。「&」の特例)
(2010年8月17日追加。確認した処理系を3つ追加)
(2010年6月10日追加。数値を指定した時の動作)

gsub = 文字列を置き換える - AWK

AWKの文字列操作関数と関連機能
○Gawk on Windows ○Gawk ○mawk32 △(全角不可)Mawk △(全角不可)awk
文字列を置き換えます。見つかった所は、全部置き換えます。

o 対象文字列を直接変更しますので、必要な時は、値をコピーしてから使います。
o 最初の1つだけを置き換えたい時は、「sub = 文字列を、最初の1つだけ置き換える


**** 書式
--------
gsub( 置換する条件, 置換後の文字列 [, 対象文字列] )
--------

o 置換する条件 -- 正規表現で指定します。左右の/を付けます。例: /ミク/
o 置換後の文字列 -- こちらは、普通の文字列です。例: "Miku"
   + 但し、文字「&」(と「\」)について特例があります。
   + 「&」は正規表現で見つかった文字列に置き換えます。「&」に変換したい時は「\\&」を使います。
   + 「\」は、特殊文字を示す文字です。「\」に変換したい時は「\\」を使います。
o 対象文字列 -- 指定した文字列を直接変更します。省略すると、変数 $0を使います。
o 戻り値 -- 置換した数

o 文字列を指定する所は、数値も指定出来ます。
   + 6桁を超える数値を指定する時は、数値から文字列に自動変換する時の最大桁数を増やします。
   + (変数CONVFMTを使用)
o なお、全角文字を使うと、結果不正になる事のある処理系もありました。ご注意下さい。
   + Mawk for Windows 1.3.3
   + original = the one true awk(updated May 1, 2007)


**** 使用例
--------
BEGIN {
  v = "ミクさん、みくさん、ミクさん。";
  n = gsub(/ミク/, "Miku", v); # Mikuさん、みくさん、Mikuさん。
  print v;
  print n "個を置き換えました。";

  v = "39.39139";
  n = gsub(/39/, "ミク", v); # ミク.ミク1ミク
  print v;
  print n "個を置き換えました。";

  v = 39.39139; # 数値の場合
  n = gsub(/39/, "ミク", v); # ミク.ミク14
  print v;
  print n "個を置き換えました。";
}
{
  n = gsub(/ミク/, "Miku"); # 対象文字列の指定が無い時は、$0を置換します。
  print $0;
  print n "個を置き換えました。";
}
--------

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


**** 機能
o 指定した条件で、文字列や数値を置き換えます。
   + 但し、対象文字列の途中に改行コードが含まれていると、改行コード以降は置き換えないみたいです。
   + 少なくとも、正規表現の「^」(= チルダ)は文字列の先頭のみを置き換えます。

o 対象文字列を直接変更します。
o 対象文字列を省略すると、変数 $0を使います。
o 見つかった所を全部置き換えて、置き換えた数を返します。
o 但し、置き換えた文字列を更に検索する事はしません。

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

** 処理系に依存する動作
o 以下の処理系では、全角文字を使うと結果不正になる事がありました。
      + Mawk for Windows 1.3.3
      + original = the one true awk(updated May 1, 2007)
o 例えば、v = "表ミクさん表表ミクさん\\aa"; gsub(/\\/, "x", v); で正しい結果になりません。
      + 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
    ▼制作メモ
    > sub = 文字列を、最初の1つだけ置き換える
    gensub = n番目に見つかった文字列を置き換える
    toupper = アルファベットを大文字にする
    +
    CONVFMT = 数値を文字列に自動変換する時の書式
    IGNORECASE = 文字列比較の時に、大文字小文字を区別させない(Gawk専用)
(2011年8月9日追加。置き換えるのは改行コードの手前まで)
(2010年8月23日追加。「&」の特例)
(2010年8月17日追加。確認した処理系を3つ追加)
(2010年6月10日追加。数値を指定した時の動作)