フィールド区切り記号の観点から、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
。