É possível usar a função bash no AWK de alguma forma?
Arquivo de exemplo (string, int, int, int)
Mike 247808 247809 247810
Tentando converter valores de decimal em hexadecimal.
Função definida no .bashrc ou no shell script.
awk '{print $1 ; d2h($2)}' file
awk: chamando a função indefinida d2h número de registro de entrada 1, número da linha de origem 1 do arquivo de arquivo
d2h
fosse um executável, mas não se for uma "função definida no .bashrc ou no shell script".source
), mas não consigo descobrir por que ele não funciona.bashrc
.$2
acaba sendo interpretado como código shell.Você pode chamar o bash do awk e usar sua saída. Isso é obviamente perigoso do ponto de vista do desempenho, se acontecer com muita frequência. Citando a página de manual:
O comando seria um script bash que contém a definição da função e executa a função.
fonte
Tente fazer isso:
AFAIK, você não pode usar uma função bash no awk, mas apenas um script. Você pode usar uma função awk, se necessário.
fonte
Usando uma função bash definida pelo usuário dentro do awk
Isenção de responsabilidade: sei que não é isso que o OP está tentando fazer, mas o Google levará outras pessoas como eu a essa resposta.
Situação
Você tem um
bash
script organizado com funções (porque você não se odeia nem com a [maioria] dos colegas de trabalho) e pelo menos uma dessas funções precisa chamar outra de dentroawk
.Solução
Roteiro
Saída
fonte
awk
pode executarawk
funções. Para executarbash
funções, você precisaawk
executar umbash
shell quebash
interprete a definição dessa função e chame essa função, com o valor extraído porawk
passado como argumentos.Não é trivial.
bash
suporta funções de exportação, para que esteja disponível em chamadas subsequentes debash
, portanto, é uma maneira de passar a definição da função para abash
chamada porawk
:As únicas maneiras de
awk
executar um comando (bash
aqui) são comsystem("cmd")
, ouprint... | "cmd"
ou"cmd" | getline
. Em todos os casos,awk
executa um shell para interpretar issocmd
, mas serásh
, nãobash
. Portanto, você precisa construir uma linha de comando, poissh
essa é umabash
chamada que interpreta umabash
linha de comando para chamar a função; portanto, você deve ter cuidado ao citar:Isso significa executar um
sh
e umbash
para cada linha, por isso será bastante ineficiente. Isso acabaria sendo ainda mais ineficiente do quebash
fazer a leitura e a divisão com umwhile read loop
:fonte
Isso lhe dará boas chances.
A função do sistema permite analisar o comando bash no fluxo do awk.
fonte
Apenas um hack rápido demonstra @HaukeLaging
command|getline
:1) deixe a entrada ser:
Após a sintaxe do shell, na entrada,
é usado para indicar comandos em linha a serem substituídos pelo resultado de sua execução.
2) Nós podemos expandir o comando shell embutido:
3) Uso (após o chmod usual):
fonte