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

Passing BASH arguments to gawk at command line

我想制作一个简单的 gawk 脚本来提取某个文件的第 n 列。文件的 namen 的值我想在命令行输入。我用 chmod +x.

使这个脚本可执行

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

 awkextract foo 3 

我对脚本 awkextract 的尝试是:

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

但是废话结果表明这是行不通的。 我该如何解决?

PS。我知道我可以通过 cut 命令做到这一点,我只是在试验......

不要通过 shebang 调用 awk,只需将其放入您的 shell 脚本中即可:

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

正如 中所指出的,最简单的方法是将其包装在 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 3 , ARGV[1]foo 并且 ARGV[2]3.

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