将parameter passing给awk脚本文件

如果我想将一个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