【问题标题】:Calling function in awk在 awk 中调用函数
【发布时间】:2021-05-27 18:57:33
【问题描述】:

我在我的程序中遇到了问题。我正在使用 awk,我试图在其中调用一个函数。

function dots()
{
    for ((i= 0 ; i < $1; i++)); do
        echo "."
    done
}


awk '{k=$1; sub(/[^ ]+ /,"__",$0); $1=$1; print $0 "\t:", (dots k) }'

然后我尝试调用该函数并将k 作为第一个参数传递(k 是一个数字)。有没有办法在awk中调用函数?

【问题讨论】:

  • 你试过用括号,比如:dots(k)
  • 是的,但它不起作用
  • 糟糕,完全错过了,这是一个shell函数。请参阅 Jens 下面的答案。

标签: bash awk


【解决方案1】:

你只是不能从 awk 调用 shell 函数。 您必须编写一个等效的 awk 函数,例如将此添加到您的 awk 脚本中:

function dots(n) {while(n-- > 0) print "."}

【讨论】:

  • 听起来不错,我发布了我的建议作为替代答案。您可能需要调整您的以检查 n 是否为正 - 如果使用负数调用它,它将进入 [near] 无限循环。要使用这样的循环稳健地创建一串连续的点(这样的函数的正常用例,而不是让它打印字符串本身)将类似于function dots(n, x) { while(n-- &gt; 0) x=x "."; return x }
  • 很好的答案。一个尼特:e.g. place this at the top of your awk script... 由于 awk 预扫描整个脚本,因此该函数可以出现在程序规则之间的任何位置。 There is no need to put the definition of a function before all uses of the function.
  • @dawg 感谢您富有洞察力的评论,我已相应地修改了我的答案。
【解决方案2】:

用awk高效创建n个点的字符串的方法是

function dots(n) { return gensub(/ /,".","g",sprintf("%*s",n,"")) }

上面的 gensub() 使用 GNU awk,其他 awk 可以使用变量和 gsub():

function dots(n,  x) { x=sprintf("%*s",n,""); gsub(/ /,".",x); return x }

万一您确实需要在每个 . 之后换行,则将 / /,"." 更改为 / /,".\n"

【讨论】:

    【解决方案3】:

    我也遇到了类似的问题,通过编写 awk 函数解决了这个问题。 我们不能只从 awk 调用 shell 函数。我们需要在 awk 命令中编写 awk 函数,如下所示:

    awk '
    function dots()
    {
        for ((i= 0 ; i < $1; i++)); do
            echo "."
        done
    }
    {k=$1; sub(/[^ ]+ /,"__",$0); $1=$1; print $0 "\t:", (dots k) }'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多