Unix 在awk中接受命令行参数
我环顾四周有一段时间,发现只有一些问题涉及到这个主题,或者给了我一个不起作用的答案。问题是: 我正在为学校做一项作业,要求我读入awk脚本的命令行参数(一开始似乎很奇怪,但呃)。我们使用的是旧版本的Unix,我正在运行Bash。此awk只有-f和-Fc选项。基本上,我一直在尝试“awk-f awk_script arg1 arg2 arg3 arg4 arg5 arg6”,但每次awk尝试将arg1作为一个文件打开时,事实并非如此。我在其他地方看到的解决这一问题的一个例子是:Unix 在awk中接受命令行参数,unix,awk,Unix,Awk,我环顾四周有一段时间,发现只有一些问题涉及到这个主题,或者给了我一个不起作用的答案。问题是: 我正在为学校做一项作业,要求我读入awk脚本的命令行参数(一开始似乎很奇怪,但呃)。我们使用的是旧版本的Unix,我正在运行Bash。此awk只有-f和-Fc选项。基本上,我一直在尝试“awk-f awk_script arg1 arg2 arg3 arg4 arg5 arg6”,但每次awk尝试将arg1作为一个文件打开时,事实并非如此。我在其他地方看到的解决这一问题的一个例子是: awk 'BEGI
awk 'BEGIN { print "ARGV[1] = ", ARGV[1] }' foo bar
它应该打印“foo”,但在这个系统上,我只得到输出“ARGV[1]=awk:cannotopenfoo”。总之,有什么办法可以解决这个问题吗?awk可以读取这些旧的命令行参数并将它们用于输入文件以外的任何东西吗?讲师的笔记文件暗示了上述用法(打印foo),但他的程序甚至没有运行,所以
任何帮助都将不胜感激
编辑后:使用SunOS 5.10且此awk不支持-v选项,只有-f和-Fc可能的解决方法(可能不可接受)是使用awk的-v选项
awk -v arg1=foo 'BEGIN { print arg1; }'
使用
nawk
或/usr/xpg4/bin/awk
。这些是awk的较新版本,支持更多功能
或者,您可以安装另一版本的awk,如
mawk
或GNU awk。您可以在读取参数后减少ARGC,以便只有第一个参数被awk
视为输入文件:
或者,您可以在读取所有参数后重置ARGC:
#!/bin/awk -f
BEGIN {
for (i=0; i<ARGC; i++) {
print ARGV[ARGC-1];
}
ARGC=2;
}
…
#/垃圾箱/awk-f
开始{
对于(i=0;iIt可能与您的操作系统版本和awk版本有关,因为…“它适合我”;)$awk'BEGIN{print“ARGV[1]=“ARGV[1]}'abc
-输出->ARGV[1]=a
。编辑您的问题,将uname-a
和awk--version
的输出包括在内。祝您好运。(你可能没有收到对--version的响应,那么你的awk是相当原始的设备;-)哈哈,我没有收到来自awk的响应--versiongiven SunOS 5.1,你使用的awk是从1977年开始的“旧”awk。试着把你调用的名字改成nawk
(新awk)。awk作者的书《awk编程语言》是关于“新”的《有效的awk编程》(2001)也很棒,涵盖了许多对gawk(gnu awk)的改进.祝你好运。他使用的awk不仅仅是旧的,它已经坏了。任何人都不能使用它。Sun需要被打一巴掌才能继续运送它。这个版本的awk不支持-v选项(它似乎是awk可以得到的最简单的版本)@WannabeCoder那么您使用的awk
版本是垃圾,您应该使用另一个版本。-v
选项是由POSIX指定的。不支持它的实现甚至不能合法地声称是awk。我将命令从“awk…”切换到“nawk…”,所有操作都正常(足够紧密)即使没有-v选项,我也希望如此。感谢您提供了有效的解决方案,但我仍然想知道为什么awk不能正常工作。您应该在Solaris上使用/usr/xpg4/bin/awk,而不是在nawk上使用,因为nawk较旧,非POSIX,并且功能较少。@EdMorton是的,/usr/xpg4/bin版本更好,但在最小的inst上可能不可用我列举了多种可能性。
#!/bin/awk -f
BEGIN {
for (i=0; i<ARGC; i++) {
print ARGV[ARGC-1];
}
ARGC=2;
}
…