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 不支持多字节字符,因此它将作为字段分隔符提供的正则表达式视为与四个字节 0x2B(“+”)、0xC2(“°”第一部分)、0xB0(“°”第二部分)和 0x2E(“.”)之一匹配。 )。它们在输入字符串中匹配四次,产生五个字段:

  • “100”
  • “50”
  • 空字符串(0xC2 和 0xB0 之间)
  • “20”
  • “5”

GAWK 会考虑当前的语言环境,并且默认支持多字节字符,因此它会匹配“°”作为字符并找到四个字段。可以通过使用该-b选项或通过使用 切换到非多字节区域设置来禁用此功能LC_ALL=C

答案2

正如 StephenKitt 和评论中明智地解释的那样,°多字节字符在上下文中被分割[°]......

解决这个问题的一种方法是使用“or”正则表达式运算符:

awk -F '[+.]|°' ...

相关内容