如果我想将参数传递给awk脚本文件,我该怎么做?
#!/usr/bin/awk -f
{print $1}
这里我想打印从shell传递给脚本的第一个参数,如:
bash-prompt> echo "test" | ./myawkscript.awk hello
bash-prompt> hello
答案 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]
echo "foo" |x.awk file1 file2 file2 -
现在是ARGV案[4]。
我的意思是,你的echo "foo"|..
对于awk来说是stdin,它可能是awk的第一个或第n个“参数”/输入。取决于你放置-
(stdin)的位置。你必须在你的awk脚本中处理它。