接受awk中的命令行参数

时间:2013-03-25 22:36:45

标签: unix awk

我已经环顾了一会儿,发现只有涉及这个主题的问题或者给我一个不起作用的答案。这是问题:

我正在为学校做作业,要求我读取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:无法打开foo”。总而言之,有什么方法可以解决这个问题吗?可以使用awk这个旧的read命令行参数并将它们用于输入文件以外的任何其他内容吗?教师注意文件暗示上述用法(打印foo),但他的程序甚至没有运行,所以......

非常感谢任何帮助。

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

3 个答案:

答案 0 :(得分:1)

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

#!/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.

答案 1 :(得分:0)

可能的解决办法 - 可能不被接受 - 是使用awk的-v选项。

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

答案 2 :(得分:0)

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

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