【问题标题】:How can I arrange the input filename and additional arguments when writing an awk script?编写 awk 脚本时如何安排输入文件名和附加参数?
【发布时间】:2017-08-19 21:22:36
【问题描述】:

我想写一个 awk 脚本,这样 我可以直接在 bash 中运行脚本名称,而无需将 awk 作为命令名称。

如何安排输入文件名和附加参数在命令行中指定并传递到脚本中?

如果脚本,比如 myscript.awk 以 shebang 开头:

#! /usr/bin/awk -f                                                                                                                                                                 

#! /usr/bin/awk  

或者没有shebang?

我应该如何编写脚本来处理命令行参数,以便我可以像myscript.awk inputfile arg1 arg2myscript.awk arg1 arg2 inputfile 一样运行它?

应该如何处理awk的选项,比如-F'\t'

或者有什么替代方法?

或者我应该通过在我的 awk 程序上编写一个调用 awk 的 bash 脚本来间接地做到这一点?

谢谢

【问题讨论】:

  • 如果您打算直接调用而不是通过awk -f myscript.awk 调用工具,请不要将其命名为myscript.awk
  • 你的意思是把它命名为myscript 没有扩展名.awk
  • 是的,我愿意。工具应该根据它们所做的事情来命名,而不是根据它们编写的语言来命名。如果你有一个用 shell(或 awk 或 python 或 perl 或 ruby​​ 或......)编写的名为“foo”的工具,并且你决定重写在 C 中,生成的工具仍应命名为“foo”。从用户 POV 来看,应该没有明显的差异。所以不要在工具名称中添加“.awk”或“.sh”或任何其他扩展名。
  • @EdMorton 谢谢。您的建议是否取决于脚本是否包含 shebang?如果我编写一个没有 shebang 的脚本,因此必须将脚本作为其解释器的参数提供,我是否应该使用扩展名(如 .sh、.awk)来命名脚本以指示其解释器?
  • 如果您正在编写一个 shell 脚本,请给它一个 shebang 并且不要包含后缀。如果您正在编写要以awk -f script.awk 等形式传递给awk 的awk(或其他工具)脚本,那么请给它一个后缀。同样,您从命令行调用的工具的名称应该与编写该工具的语言无关。

标签: awk


【解决方案1】:

我更喜欢使用 bash 来完成大部分工作,然后使用所有参数调用 awk。这样您就可以完全访问 bash 内置函数和其他内容。

你可以这样做:

#!/bin/bash

var1=$1
var2=$2
separator=$3

awk -F "$separator" -v myvar1="$var1" -v myvar2="$var2" '
    BEGIN {
        print myvar1, myvar2
    }
'

双引号很好,以防您的参数包含空格(如许多文件名)。

【讨论】:

  • 对。 AFAIK 用 shebang 启动一个 shell 脚本来调用 awk 从来没有用处,因为它剥夺了你分别使用 shell 和 awk 的能力,每个都是他们最擅长的。只需在前 3 个赋值后添加 shift 3,然后在最后一个 ' 后添加 "$@",这样 awk 就会将每个非赋值参数视为文件名:var1=$1; var2=$2; sep=$3; shift 3; ... awk 'script' "$@"。显然,您可以添加对getopts 的调用,以使shell 部分中的参数解析更加健壮。
猜你喜欢
  • 2020-08-28
  • 2023-03-31
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 2017-08-31
  • 2012-03-09
  • 2016-05-13
相关资源
最近更新 更多