具有可变数量参数的 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 提到的一堆虚拟参数名称定义函数。
如何定义具有可变数量参数的 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 提到的一堆虚拟参数名称定义函数。