Go to the first, previous, next, last section, table of contents.

文字列操作のための組み込み関数

この節で説明する関数は、1つ以上の文字列で構成されるテキストの操作に使います。

index(in, find)
文字列inの中で、文字列findの最初の出現を探し、文字列inにおいてその出現が始まる位置を返します。たとえば、
awk 'BEGIN { print index("peanut", "an") }'
これは、`3'を表示します。findが見つからない場合は、0が返されます。
length(string)
stringの文字数を返します。stringが数の場合、その数を表す数字の列の長さが返されます。たとえば、length("abcde")は5になります。一方、length(15 * 35)は3になります。分かりますか? つまり、15 * 35 = 525で、525は3文字の文字列"525"に変換されるのです。 引数を付けない場合は、$0の長さが返されます。
match(string, regexp)
文字列stringの中で、正規表現regexpにマッチする一番長く、一番左の、部分文字列を探します。戻り値は、部分文字列が始まる文字位置またはインデックスです(stringの先頭から始まる場合は1)。マッチするものが見つからない場合は、0が返されます。 match関数は、組み込み変数RSTARTをインデックスに設定します。また、組み込み変数RLENGTHをマッチした部分文字列の長さに設定します。マッチするものが見つからない場合、RSTARTは0に、RLENGTHは-1に設定されます。 たとえば、
awk '{
       if ($1 == "FIND")
         regex = $2
       else {
         where = match($0, regex)
         if (where)
           print "Match of", regex, "found at", where, "in", $0
       }
}'
このプログラムは変数regexに格納された正規表現にマッチする行を探します。この正規表現は変更されます。行の最初の単語が`FIND'の場合、regexはその行の2番目の単語に変更されます。したがって、次の入力が与えられた場合、
FIND fo*bar
My program was a foobar
But none of it would doobar
FIND Melvin
JF+KM
This line is property of The Reality Engineering Co.
This file created by Melvin.
次のように表示されます。
Match of fo*bar found at 18 in My program was a foobar
Match of Melvin found at 26 in This file created by Melvin.
split(string, array, fieldsep)
stringを、fieldsepによって区切られる断片に分解し、それをarrayに格納します。最初の断片はarray[1]に格納され、2番目の断片はarray[2]に格納されるというぐあいになります。3番目の引数fieldsepの文字列値は、stringを分解する場所を探す正規表現として使われます。fieldsepが省略されると、FSの値が使われます。splitは作成された要素数を返します。 それからsplit関数は、入力行がフィールドに分解されるのに似た方法で、文字列を断片に分解します。たとえば、
split("auto-da-fe", a, "-")
これはセパレータとして`-'を使って、文字列`auto-da-fe'を3つのフィールドに分解します。配列の内容は次のようにセットされます。
a[1] = "auto"
a[2] = "da"
a[3] = "fe"
このsplitの呼び出しによって返される値は3です。
sprintf(format, expression1,...)
同じ引数をprintf(see section 美しい表示を行うためにprintf文を使う)に与えた場合に、printfが表示する文字列を返します(表示は行いません)。たとえば、
sprintf("pi = %.2f (approx.)", 22/7)
これは、文字列"pi = 3.14 (approx.)"を返します。
sub(regexp, replacement, target)
targetの値を変更します。この関数はtargetの値(文字列であるべきです)の中で、正規表現regexpにマッチする一番左の部分文字列を、可能な限り広げて探します。次に、マッチしたテキストをreplacementで置換することにより、文字列全体を変更します。変更された文字列は新しいtargetの値になります。 この関数は、targetが値の計算に使われるわけでもなく、また、評価される式でもないため、変わった関数です。targetは変数かフィールドか配列の参照でなければなりません。これは、subが、変更された値をそこに格納できるようにするためです。この引数が省略されると、デフォルトが使われ、$0が変更されます。 たとえば、
str = "water, water, everywhere"
sub(/at/, "ith", str)
これは、 一番左の最長の `at'の 出現を `ith'で 置換することにより、 str
"wither, water, everywhere"にセットします。 sub関数は行われた置換の数を返します(1か0のいずれか)。 特殊文字`&'replacementにある場合、それはregexpにマッチした部分文字列そのものを表します(正規表現が2つ以上の文字列にマッチする場合は、この部分文字列は変化する場合があります) 。たとえば、
awk '{ sub(/candidate/, "& and his wife"); print }'
これは、各入力行で最初に現れた`candidate'を、`candidate and his wife'に変更します。 この特殊文字の効果は、文字列中の特殊文字の前にバックスラッシュを付ければ無効にできます。通常どおり、文字列の中にバックスラッシュを1つ挿入するには、バックスラッシュを2つ書かなければなりません。したがって、REPLACEMENTに`&'そのものを含めるには、文字列定数に`\\&'と書いてください。たとえば、各行の最初の`|'`&'で置換するには次のようにします。
awk '{ sub(/\|/, "\\&"); print }'
注意:上で述べたように、subの3番目の引数は左辺値でなければなりません。awkのいくつかの版では、3番目の引数に左辺値ではない式が許されます。このような場合、subはやはりパターンを探し、0か1を返しますが、置換の結果(存在する場合)は捨てられます。なぜなら、置換の結果を置く場所がないからです。このような版のawkは、次のような式を受け付けます。
sub(/USA/, "United States", "the USA and Canada")
しかし、gawkではこれは間違いであると解釈されます。
gsub(regexp, replacement, target)
この関数はsub関数に似ていますが、gsubはマッチした最長の、一番左の、オーバラップしていない部分文字列をすべて置換します。gsub`g'は"グローバル"のことで、あらゆる部分を置換することを意味します。たとえば、
awk '{ gsub(/Britain/, "United Kingdom"); print }'
これは、すべての入力レコードに対して、文字列`Britain'のすべての出現を`United Kingdom'で置換します。 gsub関数は、行われた置換の数を返します。検索され変更される変数targetが省略されると、入力レコード全体である$0が使われます。 subと同じように、`&'`\'は特殊文字で、また、3番目の引数は左辺値でなければなりません。
substr(string, start, length)
stringの、文字番号startから始まるlength文字長の部分文字列を返します。文字列の最初の文字は、文字番号1です。たとえば、substr("washington", 5, 3)"ing"を返します。 lengthを省略すると、文字番号startから始まるstringのサフィックス全体が返されます。たとえば、substr("washington", 5)"ington"を返します。
tolower(string)
string中の各大文字を、対応する小文字で置換したもののコピーを返します。非アルファベット文字は変更されません。たとえば、tolower("MiXeD cAsE 123")"mixed case 123"を返します。
toupper(string)
string中の各小文字を、対応する大文字で置換したもののコピーを返します。非アルファベット文字は変更されません。たとえば、toupper("MiXeD cAsE 123")"MIXED CASE 123"を返します。

Go to the first, previous, next, last section, table of contents.