Функция AWK с переменным числом аргументов

#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 числом аргументов.