43

If I want to pass a parameter to an awk script file, how can I do that ?

#!/usr/bin/awk -f

{print $1}

Here I want to print the first argument passed to the script from the shell, like:

bash-prompt> echo "test" | ./myawkscript.awk hello
bash-prompt> hello
4

3 回答 3

61

Inawk $1引用记录中的第一个字段,而不是像 in 中那样引用第一个参数bash。您需要为此使用ARGV,请在此处查看官方用词。

脚本:

#!/bin/awk -f

BEGIN{
    print "AWK Script"
    print ARGV[1]
}

演示:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
于 2013-04-12T12:00:59.230 回答
38

您可以使用-v命令行选项为脚本提供变量:

假设我们有一个像这样的文件script.awk

BEGIN {print "I got the var:", my_var}

然后我们像这样运行它:

$ awk -v my_var="hello this is me" -f script.awk
I got the var: hello this is me
于 2013-04-12T11:16:51.437 回答
23

你的 hash bang 定义的脚本不是 shell 脚本,它是一个 awk 脚本。您不能在脚本中以 bash 方式执行此操作。

另外,您所做的:echo blah|awk ...不是传递参数,而是将 echo 命令的输出通过管道传输到另一个命令。

您可以尝试以下方法:

 echo "hello"|./foo.awk file -

或者

var="hello"
awk -v a="$var" -f foo.awk file

有了这个,你a的 foo.awk 中有 var,你可以使用它。

如果你想做一些类似于 shell script accept $1 $2 vars 的事情,你可以写一个小的 shellscript 来包装你的 awk 东西。

编辑

不,我没有误会你。

让我们举个例子:

比方说,你x.awk有:

{print $1}

如果你这样做:

echo "foo" | x.awk file

它与以下内容相同:

echo "foo"| awk '{print $1}' file

这里 awk 的输入是 only file,你的 echo foo 没有意义。如果你这样做:

  echo "foo"|awk '{print $1}' file -
or
    echo "foo"|awk '{print $1}' - file

awk 需要两个输入(awk 的参数)一个是标准输入一个是文件,在你的 awk 脚本中你可以:

echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file

这将首先foo从您的回声中打印,然后file当然这个示例中的 column1 没有任何实际工作,只需将它们全部打印出来。

您当然可以有两个以上的输入,并且不要检查 NR 和 FNR,您可以使用

ARGC   The number of elements in the ARGV array.

ARGV   An array of command line arguments, excluding options and the program argument, numbered from zero to ARGC-1

例如 :

echo "foo"|./x.awk file1 - file2

那么你的“foo”是第二个参数,你可以在你的 x.awk 中得到它ARGV[2]

echo "foo" |x.awk file1 file2 file2 -

现在是 ARGV[4] 案例。

我的意思是,你echo "foo"|..将是 awk 的标准输入,它可以是 awk 的第一个或第 n 个“参数”/输入。取决于您放置-(stdin)的位置。您必须在 awk 脚本中处理它。

于 2013-04-12T11:35:38.890 回答