15.3.21 単語の取り出しと単語数 (word, words)

word("string",n) は、文字列 (string) の n 番目の単語を返します。例え ば word("one two three",2) は文字列 "two" を返します。

words("string") は、文字列 (string) の単語数を返します。例えば、 words(" a b c d") は 4 を返します。

関数 wordwords は、単一引用符、二重引用符で囲まれた文字列も、 限定的ですがサポートしています:


     print words("\"double quotes\" or 'single quotes'")   # 3

開始引用符の前は、スペースか、または文字列の先頭でなければいけません。 これは、単語内、あるいは単語終わりにつくアポストロフィー (') は、それ ぞれの単語の要素であると見なされることを意味します:


     print words("Alexis' phone doesn't work") # 4

引用符文字のエスケープはサポートしていませんので、ある引用符を維持した い場合は、それぞれを別の種類の引用符で囲まなければいけません:


     s = "Keep \"'single quotes'\" or '\"double quotes\"'"
     print word(s, 2) # 'single quotes'
     print word(s, 4) # "double quotes"

最後の例では、引用符のエスケープが文字列の定義時のみに必要であることに 注意してください。

split("string", "sep") は、 split("string", "sep") は、"sep" 内の文字をフィールドの区切りとして 使用し、文字列 "string" の中身を個々のフィールドに切り分けます。これは、 その要素が元の文字列のフィールドにそれぞれ対応する文字列の配列を返しま す。2 つ目のパラメータ "sep" はオプションで、"sep" を省略した場合、ま たは空白文字一つである場合は、フィールド文字列を任意個のホワイトスペー ス (スペース、タブ、改ページ、改行、復帰) で切り分けます。それ以外の場 合は、区切りは "sep" 内の完全な文字列にマッチする必要があります。

以下の 3 つの例は、いずれも配列 [ "A", "B", "C", "D" ] を生成します。


   t1 = split( "A B C D" )
   t2 = split( "A B C D", " ")
   t3 = split( "A;B;C;D", ";")

しかし、以下のコマンド


   t4 = split( "A;B; C;D", "; " )

は、2 つの文字列のみを持つ配列 [ "A;B", "C;D" ] を生成しますが、それは、 2 文字のフィールド区切り文字列 "; " が 1 つしか見つからないからです。

注意: 文字列を、1 文字ずつの配列に保存するために、区切りとして空文字を 設定することは、現在は実装されていません。それは、代わりに 1 文字の部 分文字列を使うことで実現できます: Array[i] = "string"[i:i]

join(array, "sep") は、配列の文字列要素を、"sep" の文字列で区切られ たフィールドの列として一つの文字列に連結します。文字列でない配列要素は、 空のフィールドを生成します。この逆に split 関数は一つの文字列を複数 のフィールドに切り分けて一つの配列を生成します。 例:


   array A = ["A", "B", , 7, "E"]
   print join(A,";")
         A;B;;;E

trim(" padded string ") は、元の文字列の前後にある空白部分を取り除 いた文字列を返します。これは、余計な空白を持ちうる入力データ列の文字列 同士を比較する際に有用です。例:


    plot FOO using 1:( trim(strcol(3)) eq "A" ? $2 : NaN )

竹野茂治@新潟工科大学
2023-09-28