3

我喜欢定义一个包装现有 awk 命令的新命令,例如print. 但是,我不想使用函数:

#wrap command with function
function warn(text) { print text > "/dev/stderr" }
NR%1e6 == 0 {
  warn("processed rows: "NR)
}

相反,我喜欢定义一个可以不带括号调用的新命令:

#wrap command with new command ???
define warn rest... { print rest... > "/dev/stderr" }
NR%1e6 == 0 {
  warn "processed rows: "NR
}

我可以想象的一种解决方案是使用预处理器,并且可以很好地设置 awk 脚本的 shebang 以调用此预处理器,然后调用 awk。但是,我更希望有一个纯粹的 awk 解决方案。

注意:该解决方案也应该在我使用的mawk中工作,因为它比vanilla GNU/awk快得多。

更新:讨论表明gawk(GNU/awk)可以非常快并且mawk不是必需的。

4

2 回答 2

0

查看 Mawk 的源代码,我发现命令很特殊,无法在运行时添加。来自kw.c

keywords[] =
{
    { "print",    PRINT },
    { "printf",   PRINTF },
    { "do",       DO },
    { "while",    WHILE },
    { "for",      FOR },
    { "break",    BREAK },
    { "continue", CONTINUE },
    { "if",       IF },
    { "else",     ELSE },
    { "in",       IN },
    { "delete",   DELETE },
    { "split",    SPLIT },
    { "match",    MATCH_FUNC },
    { "BEGIN",    BEGIN },
    { "END",      END },
    { "exit",     EXIT },
    { "next",     NEXT },
    { "nextfile", NEXTFILE },
    { "return",   RETURN },
    { "getline",  GETLINE },
    { "sub",      SUB },
    { "gsub",     GSUB },
    { "function", FUNCTION },
    { (char *) 0, 0 }
};

您可以通过修补 Mawk 的 C 代码来添加新命令。

于 2014-12-17T18:08:54.493 回答
0

您不能在任何 awk 中执行此操作,并且如果不编写 awk 语言解析器,您将无法在 awk 之外稳健地执行此操作,并且到那时您也可以编写自己的类似 awk 的命令,然后实际上将不再是真正的 awk它的行为与该名称的任何其他命令不同。

奇怪的是,您将 GNU awk 称为“香草”,因为它比任何其他当前可用的 awk 都具有更多有用的功能,而 mawk 只是为速度优化的精简 awk,仅在极少数情况下才需要。

于 2014-12-17T20:42:31.977 回答