[英]The differences between gawk and mawk (column width)
我有一个文件:
To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8,
żeby
było śmieszniej, haha.
ą
a
示例傻瓜:
gawk '{printf "%-80s %-s\n", $0, length}' file
在 gawk 中,我得到了正确的结果:
To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8, 73
żeby 5
było śmieszniej, haha. 22
ą 1
a 1
示例:
mawk '{printf "%-80s %-s\n", $0, length}' file
To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8, 80
żeby 6
było śmieszniej, haha. 24
ą 2
a 1
作为 mawk 得到与 gawk 相同的结果?
mawk 是一个功能最少的 awk,旨在提高执行速度而不是功能。 您不应期望它的行为与 gawk 或 POSIX awk 完全相同。 如果您要使用 mawk,则需要获取描述 IT 行为方式的mawk 手册,不要依赖任何其他描述其他 awk 行为方式的文档。
恕我直言,格式化字符串%-s
没有正确的结果,因为在不指定对齐宽度的情况下对齐字符串是没有意义的。 对于length
本身的含义也有不同的解释 - 它可能是length($0)
的简写,也可能是非 POSIX awk 中的其他东西,在某些非 POSIX awk 中甚至可能没有长度函数因此它可能会将其视为未定义的变量名。 任何给定的 awk 如何处理非英文字符?
正如我所说 - 如果您要使用非 POSIX awk,您需要查看该 awk 的手册以了解所有血腥细节......
我假设您使用的是不同的系统...因为系统上的 awk 安装曾经是 gawk 或 mawk 的符号链接。
只要版本一致,所有 awk 版本都是兼容的。
因此,我假设您面临的问题是由于使用了旧版本和新版本的程序。
更新1:意识到我可以大规模简化它-
唯一需要做的就是将UTF-8
连续字节的计数填充到总宽度中,并通过这样定义FS
,那么对于非空行,计数将始终为NF - 1
,尾部的计数行尾反映了UTF-8 character count
(严格来说……这是一个代码点数)
警告:此代码大胆假设输入是有效UTF-8
开头,不执行数据验证检查
=
mawk[1/2]|gawk -b '
$!NF = sprintf("%-*s %s",(__=NF-!_)+80,$_,length($_)-__)' FS='[\\200-\\277]'
=
To jest długi string z wieloma polskimi literami ąółżęś kodowany w UTF8, 73
żeby 5
było śmieszniej, haha. 22
ą 1
a 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.