【问题标题】:Accepting command line parameters in awk在 awk 中接受命令行参数
【发布时间】:2013-03-15 14:27:41
【问题描述】:

我环顾四周,发现只有涉及该主题的问题或提供给我的答案不起作用。问题来了:

我正在为学校做一个作业,要求我读入 awk 脚本的命令行参数(一开始这似乎很奇怪,但是嗯)。我们使用的是旧版本的 Unix,而我正在运行 Bash。此 awk 只有 -f 和 -Fc 选项。基本上,我一直在尝试执行“awk -f awk_script arg1 arg2 arg3 arg4 arg5 arg6”,但每次 awk 都尝试将 arg1 作为文件打开,但事实并非如此。我在其他地方看到的一个例子是:

awk 'BEGIN { print "ARGV[1] = ", ARGV[1] }' foo bar

它应该打印“foo”,但在这个系统上我只得到输出“ARGV[1] = awk: can't open foo”。所以,总而言之,有没有办法解决这个问题?可以 awk 这个旧的读取命令行参数并将它们用于输入文件以外的任何内容吗?讲师注释文件暗示了上述用法(打印 foo),但他的程序甚至没有运行,所以......

任何帮助将不胜感激。

编辑后:使用 SunOS 5.10 且此 awk 不支持 -v 选项,仅支持 -f 和 -Fc

【问题讨论】:

  • 这可能与您的操作系统版本和 awk 版本有关,因为...“它适用于我”;-) $ awk 'BEGIN{ print "ARGV[1]=" ARGV[1]}' a b c - 输出 ->argv[1]=a。编辑您的问题以包含来自uname -aawk --version 的输出。祝你好运。 (您可能没有得到 --version 的响应,那么您的 awk 是非常原始的设备;-)
  • 哈哈 我没有得到 awk --version 的回复
  • 在 SunOS 5.1 中,您使用的 awk 是 ~1977 年的“旧”awk。尝试将您呼叫的名称更改为nawk。 (新的 awk)。 awk 的作者 'The Awk Programming Language' 的书是关于“新”awk 的,于 1988 年出版,但仍然强烈推荐。 'Effective Awk Programming' (2001) 也很棒,涵盖了对 gawk (gnu-awk) 的许多增强。祝你好运。
  • 他使用的 awk 不仅旧了,而且坏了。任何人都不能使用它,永远。 Sun 需要被扇耳光才能继续运送它。

标签: unix awk


【解决方案1】:

您可以在读取参数后减少 ARGC,以便awk 仅将第一个参数视为输入文件:

#!/bin/awk -f

BEGIN {
    for (i=ARGC; i>2; i--) {
        print ARGV[ARGC-1];
        ARGC--;
    }
}
…

或者,您可以在读取所有参数后重置 ARGC:

#!/bin/awk -f

BEGIN {
    for (i=0; i<ARGC; i++) {
        print ARGV[ARGC-1];
    }
    ARGC=2;
}
…

这两种方法都将正确处理myawkscript.awk foobar foo bar …,就好像 foobar 是唯一要处理的文件一样(当然,如果您希望将前两个参数作为文件等,您可以将 ARGC 设置为 3)。在您的特定情况下,您似乎不想处理任何文件,因此您将 ARGC 设置为 1。

【讨论】:

    【解决方案2】:

    使用nawk/usr/xpg4/bin/awk。这些是支持更多功能的较新版本的 awk。

    或者,您可以安装另一个版本的 awk,例如 mawk 或 GNU awk。

    【讨论】:

    • 我将命令从“awk ....”切换到“nawk ...”,即使没有 -v 选项,一切正常(非常接近)完全符合我的要求。感谢您提供有效的解决方案,但我仍然想知道为什么 awk 不能正常工作。
    • 您应该在 Solaris 上使用 /usr/xpg4/bin/awk 而不是 nawk,因为 nawk 较旧、非 POSIX 且功能较少。
    • @EdMorton 是的,/usr/xpg4/bin 版本更好,但在最小安装时可能不可用。我列出了多种可能性。
    【解决方案3】:

    一种可能的解决方法(可能不可接受)是使用 awk 的 -v 选项。

    awk -v arg1=foo 'BEGIN { print arg1; }'
    

    【讨论】:

    • 这个版本的 awk 不支持 -v 选项(它似乎是 awk 所能得到的最简单的)。
    • @WannabeCoder 那么您使用的awk 版本是垃圾,您应该使用其他版本。 -v 选项由 POSIX 指定。不支持它的实现甚至不能合法地声称是 awk。
    猜你喜欢
    • 1970-01-01
    • 2017-04-27
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多