フィールド区切り記号の観点から、gawkとmawkの違いは何ですか?

フィールド区切り記号の観点から、gawkとmawkの違いは何ですか?

フィールド区切り記号の観点から、gawkとmawkの違いは何ですか?特にここで何が起こっているのか知りたいです。

模造品:

$ echo "100+50°20.5" | mawk -F '[+°.]' '{ print $1" - "$2" - "$3" - "$4" - "$5; }'
100 - 50 -  - 20 - 5

愚かな:

$ echo "100+50°20.5" | gawk -F '[+°.]' '{ print $1" - "$2" - "$3" - "$4" - "$5; }'
100 - 50 - 20 - 5 -

mawkが何とか追加のフィールドを導入しているようです。正しい行動とは何ですか?

ベストアンサー1

ここで何が起こっているのかを理解するには、AWKに入力として提供されるバイトを見てください。

$ od -t x1 <<<"100+50°20.5"
0000000 31 30 30 2b 35 30 c2 b0 32 30 2e 35 0a
0000015

UTF-8では、「°」は0xC2 0xB0で表されるマルチバイト文字です。MAWKはマルチバイト文字をサポートしていません。したがって、フィールド区切り記号として与えられた正規表現は、4バイトの0x2B("+")、0xC2("°"の最初の部分)、0xB0("°"の2番目の部分)、および0x2E(".")はそのうちの1つです。一致します。 )。入力文字列で4回一致して5つのフィールドが生成されます。

  • 「100」
  • 「50」
  • 空の文字列(0xC2と0xB0の間)
  • 「20」
  • 「5」

GAWKは現在のロケールを考慮し、デフォルトでマルチバイト文字をサポートしているので、「°」を文字で一致させ、4つのフィールドを探します。この機能は、このオプションを使用するか、-bマルチバイトではなくロケールへの切り替えを使用して無効にすることができますLC_ALL=C

おすすめ記事