この節で説明する関数は、1つ以上の文字列で構成されるテキストの操作に使います。
index(in, find)
awk 'BEGIN { print index("peanut", "an") }'
これは、`3'を表示します。findが見つからない場合は、0が返されます。
length(string)
length("abcde")は5になります。一方、length(15 * 35)は3になります。分かりますか? つまり、15 * 35 = 525で、525は3文字の文字列"525"に変換されるのです。
引数を付けない場合は、$0の長さが返されます。
match(string, regexp)
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)
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)
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)
substr("washington", 5, 3)は"ing"を返します。
lengthを省略すると、文字番号startから始まるstringのサフィックス全体が返されます。たとえば、substr("washington", 5)は"ington"を返します。
tolower(string)
tolower("MiXeD cAsE 123")は"mixed case 123"を返します。
toupper(string)
toupper("MiXeD cAsE 123")は"MIXED CASE 123"を返します。