如果我想向awk脚本文件传递参数,我该怎么做?
#!/usr/bin/awk -f
{print $1}
我想在脚本中打印从shell传递给脚本的第一个参数,例如:
bash-prompt> echo "test" | ./myawkscript.awk hello
bash-prompt> hello
#!/bin/awk -f
BEGIN{
print "AWK Script"
print ARGV[1]
}
示例:
$ ./script.awk "Passed in using ARGV"
AWK Script
Passed in using ARGV
你可以在命令行使用-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
cat file | script.awk -v my_var="hello this is you"
。 - xdhmoore你的hash bang定义了这个脚本不是shell脚本,而是一个awk脚本。你不能在脚本中以bash方式执行它。
另外,你所做的:echo blah|awk ...
并没有传递参数,而是将echo命令的输出通过管道传递给另一个命令。
你可以尝试以下这些方法:
echo "hello"|./foo.awk file -
或者var="hello"
awk -v a="$var" -f foo.awk file
通过这样,你的foo.awk中有变量a
,你可以使用它。
如果你想要做一些像shell脚本接受$1 $2这样的变量,你可以写一个小的shell脚本来包装你的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的参数),一个是标准输入,另一个是文件,在您的awk脚本中,您可以:
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”是第二个参数,你可以通过 ARGV[2]
在你的 x.awk 中获取它。
echo "foo" |x.awk file1 file2 file2 -
现在是ARGV[4]的情况。
我的意思是,你的echo "foo"|..
会成为awk的stdin,它可以是awk的第一个或第N个"参数"/输入,具体取决于你在哪里放置了-
(stdin)。你必须在你的awk脚本中处理它。
echo foo|./x.awk file
先打印出 foo
,那么请使用 echo foo|./x.awk - file
。 - Kentawk {print 1}
这样做。这是否意味着 awk
总是需要 awk <commands> file
或 something | awk <commands>
? - fedorquiawk 'BEGIN{print "kent"}'
- Kent