具有可变数量参数的 AWK 函数

AWK function w/ a variable number of arguments

如何定义具有可变数量参数的 AWK 函数?我可以用命令行参数模拟这个:

awk 'BEGIN {for (i in ARGV) printf ARGV[i]" "}' 1 2 3

BEGIN {for (i in ARGV) printf ARGV[i]" "} 不是函数(在 AWK 中)。

目前我正在使用 MAWK(但如果有帮助,我可能会切换到 GAWK)

注意:我不能透露任务(这是一个我应该自己解决的练习)

根据https://rosettacode.org/wiki/Variadic_function,您可以定义一个参数比传入的参数更多的函数;您省略的那些将显示为空。

从你的例子中并不清楚你实际想要完成什么,但这是你实际问题的答案。

$ awk 'function handlemany(first, second, third, fourth, fifth, sixth, seventh, eighth, ninth, tenth, eleventh, twelfth) {
>   print first, second, third, fourth, fifth, sixt, seventh, eighth, ninth, tenth, eleventh, twelfth
> }
> BEGIN { handlemany("one", "two", "three") }'
one two three       

当然,这并不理想,但是在 Awk 语言中不支持适当的可变参数函数/varargs

awk 中没有可变参数函数,因为不需要它们,因为您可以填充数组并将其传递给函数:

$ cat tst.awk
BEGIN {
    split("foo 17 bar",a)
    foo(a)
}

function foo(arr,       i,n) {
    n = length(arr)     # or loop incrementing n if length(arr) unsupported
    for (i=1; i<=n; i++) {
        printf "%s%s", arr[i], (i<n ? OFS : ORS)
    }
}
$ awk -f tst.awk
foo 17 bar

或者只是用@triplee 提到的一堆虚拟参数名称定义函数。