gawk和mawk之间的差异(列宽)

gawk和mawk之间的差异(列宽),awk,gawk,Awk,Gawk,我有一个文件: 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 mawk '{printf "%-80s %-s\n", $0, length}' file To jest długi string z wieloma

我有一个文件:

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
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
在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:

gawk '{printf "%-80s %-s\n", $0, length}' file
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,您需要获得一个描述其行为的文档,不要依赖任何其他描述其他awk行为的文档

IMHO格式化字符串
%-s
没有正确的结果,因为如果不指定对齐字符串的宽度,对齐字符串是没有意义的。对于
length
本身的含义也有不同的解释-它可能是
length($0)
的缩写,也可能是非POSIX awk中的其他内容,甚至可能在某些非POSIX awk中没有长度函数,因此可能会将其作为未定义的变量名。任何给定的awk如何处理非英语字符


正如我所说的-如果您要使用非POSIX awk,您需要检查该awk的手册中所有血淋淋的细节…

我假设您使用的是不同的系统。。。因为系统上的awk安装通常是gawk或mawk的符号链接

只要版本一致,所有awk版本都是兼容的


因此,我假设您面临的问题是由于使用了较旧和较新版本的程序。

mawk
是符合POSIX标准的awk。@teppic-恐怕不是。虽然mawk声称它支持扩展正则表达式,但它未能实现POSIX字符类,如1.3.4版之前的
[:digit://code>,
[:upper://code>,
[:lower://code>,以及当前随1.3.3版提供的许多linux发行版。所以在实践中不符合POSIX。首先,不同的awk实现不一定兼容,其他答案也提到了这一点。其次,在同一系统上安装不同的awk实现并使用绝对路径调用它们并不困难。所以你的回答既不正确也没有特别的帮助。