2013-03-25 273 views
0

我环顾了一会儿,发现只有触及主题的问题或者提供了一个不起作用的答案。这里的问题:在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:无法打开富”。总而言之,有没有办法解决这个问题?可以awk这个旧的读取命令行参数,并将它们用于除输入文件以外的其他任何内容?教官笔记文件暗示上述用法(印刷foo),但他的程序甚至不运行,所以...

任何帮助将不胜感激。

编辑后:使用的SunOS 5.10和这个awk不支持-v选项,只有-f和-FC

+0

它可能是关于你的操作系统和awk版本的问题,因为......“对我来说“;-)'$ awk'BEGIN {print”ARGV [1] =“ARGV [1]}'abc' - 输出 - >'argv [1] = a'。编辑你的问题以包含'uname -a'和'awk --version'的输出。祝你好运。 (你可能没有得到--version的响应,那么你的awk是非常原始的设备; - ) – shellter 2013-03-25 22:48:58

+0

哈哈我没有得到awk的回复--version – WannabeCoder 2013-03-25 23:04:27

+1

给定了SunOS 5.1,你使用的awk是“旧的“〜1977年的awk。尝试将您调用的名称更改为'nawk'。 (新的awk)。这本由awk的作者编写的The Awk Programming Language的书是关于“新”awk的,并于1988年出版,但仍然极力推荐。 '有效的Awk编程'(2001)也很棒,涵盖了许多对gawk(gnu-awk)的增强。祝你好运。 – shellter 2013-03-26 00:43:08

回答

0

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

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

+0

我将命令从“awk ....”切换到“nawk ...”,即使没有-v选项,一切正常(足够紧密),完全符合我的要求。感谢工作解决方案,但我仍然想知道为什么awk不能正常工作。 – WannabeCoder 2013-03-25 23:19:59

+2

由于nawk较旧,非POSIX且功能较少,因此应在Solaris上使用/ usr/xpg4/bin/awk而不要使用nawk。 – 2013-03-26 00:49:45

+0

@EdMorton是的,/ usr/xpg4/bin版本更好,但在最小安装时可能无法使用。我列出了多种可能性。 – jilles 2013-03-30 11:43:13

0

一个可能的解决办法 - 也许不能接受的 - 是使用的-v选项awk

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

这个版本的awk不支持-v选项(它看起来像awk可以获得的那样简单)。 – WannabeCoder 2013-03-25 23:10:51

+0

@WannabeCoder然后,你使用的'awk'版本是垃圾,你应该使用不同的。 '-v'选项由POSIX指定。不支持它的实现不能合法地声称是awk。 – 2017-08-16 05:58:28

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.