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 不支持多字节字符,因此它将作为字段分隔符提供的正则表达式视为与四个字节 0x2B(“+”)、0xC2(“°”第一部分)、0xB0(“°”第二部分)和 0x2E(“.”)之一匹配。 )。它们在输入字符串中匹配四次,产生五个字段:
- “100”
- “50”
- 空字符串(0xC2 和 0xB0 之间)
- “20”
- “5”
GAWK 会考虑当前的语言环境,并且默认支持多字节字符,因此它会匹配“°”作为字符并找到四个字段。可以通过使用该-b
选项或通过使用 切换到非多字节区域设置来禁用此功能LC_ALL=C
。
答案2
正如 StephenKitt 和评论中明智地解释的那样,°
多字节字符在上下文中被分割[°]
......
解决这个问题的一种方法是使用“or”正则表达式运算符:
awk -F '[+.]|°' ...