Можно ли как-то использовать функцию bash внутри AWK?
Файл примера (строка, int, int, int)
Mike 247808 247809 247810
Попытка преобразовать значения из десятичного в шестнадцатеричное.
Функция определена либо в .bashrc, либо в сценарии оболочки.
awk '{print $1 ; d2h($2)}' file
awk: вызов неопределенной функции d2h входная запись номер 1, строка файла исходного файла номер 1
d2h
был исполняемый файл, но не в том случае, если это «функция, определенная либо в .bashrc, либо в сценарии оболочки».source
), но я не могу понять, почему он не работает.bashrc
.$2
конечном итоге интерпретируется как шелл-код.Вы можете вызвать bash из awk и использовать его вывод. Это очевидно опасно с точки зрения производительности, если это происходит слишком часто. Цитирую справочную страницу:
Команда будет скриптом bash, который содержит определение функции и выполняет функцию.
источник
Попробуйте сделать это:
AFAIK, вы не можете использовать функцию bash в awk, а только скрипт. При необходимости вы можете использовать функцию awk.
источник
Использование определенной пользователем функции bash внутри awk
Отказ от ответственности: я понимаю, что это не то, что ОП пытается сделать, но Google приведет других, как я, к этому ответу.
ситуация
У вас есть
bash
сценарий, организованный с помощью функций (потому что вы не ненавидите себя или [большинство] коллег), и по крайней мере одна из этих функций должна вызывать другую изнутриawk
.Решение
скрипт
Выход
источник
awk
может запускатьawk
функции. Чтобы запуститьbash
функции, вам необходимоawk
выполнитьbash
оболочку, котораяbash
интерпретирует определение этой функции, и вызовите эту функцию со значением, извлеченным с помощьюawk
аргумента.Не тривиально.
bash
поддерживает экспорт функций, поэтому он доступен в последующих вызовахbash
, так что это один из способов передать определение функцииbash
вызываемой функцииawk
:Единственные способы
awk
выполнить команду (bash
здесь) - это ееsystem("cmd")
или,print... | "cmd"
или"cmd" | getline
. Во всех случаяхawk
запускается оболочка для интерпретации этогоcmd
, но этоsh
не такbash
. Таким образом, вам нужно создать командную строку дляsh
этогоbash
вызова, который интерпретируетbash
командную строку для вызова функции, поэтому вы должны быть осторожны с цитированием:Это означает, что нужно запускать один
sh
и одинbash
для каждой строки, так что это будет довольно неэффективно. В конечном итоге это будет даже значительно более неэффективно, чемbash
чтение и разбиение с помощьюwhile read loop
:источник
Это даст вам хорошие шансы.
Системная функция позволяет вам анализировать команду bash в потоке awk.
источник
Просто быстрый взлом демонстрации @HaukeLaging
command|getline
:1) пусть вход будет:
Следующий синтаксис оболочки, на входе,
используется для обозначения встроенных команд, которые должны быть заменены результатом его выполнения.
2) Мы можем расширить встроенную команду оболочки:
3) Использование (после обычного chmod):
источник