在命令行中将BASH参数传递给gawk

时间:2017-08-28 12:25:51

标签: bash awk command-line gawk

我想创建一个简单的gawk脚本来提取某个文件的第n列。我希望在命令行输入文件的名称 n 的值。这个脚本我使用chmod +x生成可执行文件。

因此,要从文件foo中提取第三列,我将输入:

 awkextract foo 3 

我对脚本awkextract的尝试是:

 #!/opt/local/bin/gawk -v k=$2 -f 
 {print $k}

但是无意义的结果表明这不起作用。 我该如何解决?

PS。我知道我可以通过cut命令执行此操作,我只是在尝试......

2 个答案:

答案 0 :(得分:5)

不要通过shebang调用awk,只需将它放在shell脚本中:

/opt/local/bin/gawk -v k="$2" '
{print $k}
' "$1"

答案 1 :(得分:1)

正如Ed Morton's answer中所指出的,最简单的方法是将其包装在shell脚本中。但是,在awk可执行文件中执行此操作并非不可能,尽管非常笨拙:

#!/usr/local/bin/awk -f

BEGIN {
    col = ARGV[2]
    ARGV[2] = ""
}

{ print $col }

/usr/local/bin/awk只是我机器上awk的路径。

BEGIN块中,我们直接操作参数列表:我们将col设置为第二个命令行参数,然后将第二个参数设置为空字符串。 ARGV数组包含所有命令行参数,并且为零索引,ARGV[0]通常包含awk(但这取决于您的系统),因此对于命令./awkextract foo 3ARGV[1]fooARGV[2]3

现在ARGV中剩下的唯一非空参数是要处理的文件的名称,并为其每一行运行{ print $col }操作。