将参数传递给awk脚本文件

时间:2013-04-12 11:10:54

标签: linux unix awk

如果我想将参数传递给awk脚本文件,我该怎么做?

#!/usr/bin/awk -f

{print $1}

这里我想打印从shell传递给脚本的第一个参数,如:

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

3 个答案:

答案 0 :(得分:51)

awk $1中,引用记录中的第一个字段而不是bash中的第一个字段。您需要使用ARGV来查看 here 以获取正式用语。

脚本:

#!/bin/awk -f

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

演示:

$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV

答案 1 :(得分:25)

您可以使用-v作为command-line option为脚本提供变量:

假设我们有一个 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

答案 2 :(得分:16)

你的哈希爆炸定义了脚本不是shell脚本,它是一个awk脚本。你不能在你的剧本中以bash的方式做到这一点。

另外,你做了什么:echo blah|awk ... 传递参数,它将echo命令的输出传递给另一个命令。

你可以尝试以下方式:

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

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

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

如果你想做一些像shell脚本接受$ 1 $ 2 vars的东西,你可以写一个小的shellcript来包装你的awk东西。

修改

不,我没有误会你。

让我们举个例子:

比方说,您的x.awk有:

{print $1}

如果你这样做:

echo "foo" | x.awk file

它与:

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

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

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

awk接受两个输入(awk的参数)一个是stdin,一个是文件,在你的awk脚本中你可以:

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

这将从您的回显中首先打印foo,然后来自file的第1列当然这个示例不执行任何实际操作,只需将它们全部打印出来。

你当然可以有两个以上的输入,而且不检查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”是第二个arg,你可以通过ARGV[2]

在你的x.awk中得到它
echo "foo" |x.awk file1 file2 file2 -

现在是ARGV案[4]。

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