我想创建一个简单的gawk
脚本来提取某个文件的第n列。我希望在命令行输入文件的名称和 n 的值。这个脚本我使用chmod +x
生成可执行文件。
因此,要从文件foo中提取第三列,我将输入:
awkextract foo 3
我对脚本awkextract
的尝试是:
#!/opt/local/bin/gawk -v k=$2 -f
{print $k}
但是无意义的结果表明这不起作用。 我该如何解决?
PS。我知道我可以通过cut
命令执行此操作,我只是在尝试......
答案 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 3
,ARGV[1]
为foo
,ARGV[2]
为3
。
现在ARGV
中剩下的唯一非空参数是要处理的文件的名称,并为其每一行运行{ print $col }
操作。