【问题标题】:awk - Pass arguments (ARGV) and file to parse in the same commandawk - 传递参数 (ARGV) 和文件以在同一命令中解析
【发布时间】:2012-09-23 23:51:11
【问题描述】:
我正在运行 ubuntu11.10,我认为它默认使用 mawk。假设我有一个名为“script.awk”的 awk 脚本,它接收一个参数。我还想指定要解析的文件的名称。因此,如果我使用“10”作为解析“文件”的参数,我应该运行:
./script.awk 10 file
但是,'10' 被解释为要解析的文件,而不是参数。我知道我可以使用 -v 标志来设置一个内部变量,但我想使用 ARGV 来检查参数是否被传递,例如:
if (ARGC < 2) { exit 1 }
是否有解决方法,或者我将不得不粘贴 -v 标志?
【问题讨论】:
标签:
parameters
awk
arguments
【解决方案1】:
添加到上面的注释(添加BEGIN后)需要找到正确的awk。
我们有 awk 的版本(如 nawk、gawk)。
尝试使用 man(或帮助)查找 ARGC 和 ARGV 属于哪个版本的 AWK 命令。
使用相应的 AWK。
nawk 'BEGIN{if(ARGC>9) print "it ll get print . as i used NAWK" }' 1 2 3 4 5 6 7 8 9
输出:
it ll get print . as i used NAWK
awk 'BEGIN{if(ARGC>9) print "It throw error . as i used AWK " }' 1 2 3 4 5 6 7 8 9
输出:
awk: can't open 1
【解决方案2】:
awk 脚本中的 BEGIN 块在使用参数之前执行。这使您有机会检查正确数量的参数并进行更改。有一个特殊的行为,如果参数是一个空字符串,它会被跳过,所以你可以这样做:
BEGIN {
if (ARGC<3) exit(1);
arg=ARGV[1]
ARGV[1]=""
}