如果我想将一个parameter passing给一个awk脚本文件,我该怎么做?
#!/usr/bin/awk -f {print $1}
这里我想打印从shell中传递给脚本的第一个参数,如:
bash-prompt> echo "test" | ./myawkscript.awk hello bash-prompt> hello
你的hash bang定义的脚本不是shell脚本,它是一个awk脚本。 你不能在你的脚本中以bash的方式来做到这一点。
另外,你做了什么: echo blah|awk ...
不传递参数,它将echo命令的输出传递给另一个命令。
你可以尝试下面的方法:
echo "hello"|./foo.awk file -
要么
var="hello" awk -va="$var" -f foo.awk file
有了这个,你有a
你的foo.awk,你可以使用它。
如果你想做一些像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的参数),一个是stdin,一个是文件,在你的awk脚本中你可以:
echo "foo"|awk 'NR==FNR{print $1;next}{print $1}' - file
这将从你的echo中打印第一个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”就是第二个arg,你可以在你的x.awk中通过ARGV[2]
echo "foo" |x.awk file1 file2 file2 -
现在是ARGV [4]的情况。
我的意思是,你的echo "foo"|..
将是awk的stdin,它可能是awk的第1或第n个“参数”/输入。 取决于你把-
(stdin)放在哪里。 你必须在你的awk脚本中处理它。
在awk
$1
引用记录中的第一个字段,而不是像bash
的第一个字段。 你需要使用ARGV
这个,在这里检查官方字。
脚本:
#!/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