#awk #variadic-functions
#awk #переменные-функции
Вопрос:
Как определить AWK-функцию с переменным числом аргументов? Я могу эмулировать это с аргументами командной строки:
awk 'BEGIN {for (i in ARGV) printf ARGV[i]" "}' 1 2 3
но BEGIN {for (i in ARGV) printf ARGV[i]" "}
не является функцией (в AWK).
В настоящее время я использую MAWK (но, вероятно, могу переключиться на GAWK, если это поможет)
ПРИМЕЧАНИЕ: я не могу раскрыть задачу (это упражнение, которое я должен решить сам)
Комментарии:
1. Ваш вопрос не ясен, вам нужно выполнить ту же операцию (печать всех имен файлов или переданных аргументов
awk
) в функции? не могли бы вы, пожалуйста, уточнить подробнее об одном и том же.2. @RavinderSingh13 Нет, я этого не делаю. Это всего лишь пример, показывающий все аргументы командной строки
3. Конечно, если бы вы могли показать образцы ввода и ожидаемого результата в своем вопросе, это дало бы нам лучшую картину, и да, мы можем сделать это с помощью функции.
4. Не могли бы вы, пожалуйста, проверить
awk -v var="var1,var2,var3,var4,var5" 'BEGIN{num=split(var,arr,",");for(i=1;i<=num;i ){print i,arr[i]}}'
, действительно ли это то, что вы ищете здесь? Передайте все значения, к которым вы хотите получить доступ вawk
программе, вawk
переменную с именемvar
и разделите ее внутриBEGIN
раздела, и вы сможете получить все значения элементов с использованием массива. Дайте мне знать, если это то, что вы ищете?5. Это было больше похоже на предположение, если бы вы могли привести мне пример, объясните мне больше, может быть, я мог бы попытаться помочь больше, спасибо.
Ответ №1:
В 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.
Ответ №2:
Согласно 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
числом аргументов.