1

awksplit(string, array, separator)で一連の空白を区切り記号として使用できますか (または、より一般的には任意の正規表現を区切り記号として使用できますか?)

明らかに、内部自動分割 (変数の値をセパレーターとして入力の各行で実行される) を使用でき、FSシンプルfor$0魔法のように機能します。splitただし、それ自体を使用するより簡単な方法があるかどうかは疑問に思っていました。

4

2 に答える 2

2

GNU awk(1) マニュアルページから:

split(s, a [, r])

文字列 s を正規表現 r の配列 a に分割し、フィールドの数を返します。r を省略すると、代わりに FS が使用されます。

ここでのポイントは、任意の正規表現を使用してフィールド分割を実行できるということです。少なくとも gawk では可能です。他のものを使用している場合は、ドキュメントを確認する必要があります。

于 2012-06-23T11:55:04.373 に答える
2

GNU Awk ユーザー ガイドには、次のように記載されています。

split(string, array, fieldsep)

これは、string を fieldsep で区切られた断片に分割し、その断片を配列に格納します。最初のピースは配列 [1] に格納され、2 番目のピースは配列 [2] に格納され、以下同様です。3 番目の引数fieldsepの文字列値は、文字列を分割する場所を記述する正規表現です (FS が入力レコードを分割する場所を記述する正規表現であるのと同じように)。fieldsep を省略すると、FS の値が使用されます。split は、作成された要素の数を返します。次に、split 関数は、入力行がフィールドに分割されるのと同様の方法で文字列を断片に分割します。

以下は、任意の 1 文字の後に小文字とスペースが続く単純な正規表現 を使用する短い (ややばかげた) 例です。分割の結果は array に入れられます。一致する部分は配列に配置されないことに注意してください。".s "sa

BEGIN { 
  s = "this isn't a string yes isodore?"
  count = split(s, a, ".s ")
  printf("number of splits: %d\n", count)

  print "Contents of array:"
  for (i = 1; i <= count; i++) 
    printf "a[%d]: %s\n", i, a[i]
}

出力:

$ awk -f so.awk

number of splits: 3
Contents of array:
a[1]: th
a[2]: isn't a string y
a[3]: isodore?

システム管理者向けの Advanced Awkという記事では、 を使用して行を解析する例を示していsplit()ます。このページには、正規表現を使用してデータを配列に分割する例が含まれています。

于 2012-06-23T11:56:25.410 に答える