Internamente gawk
armazena o valor convertido em um ponto flutuante de precisão dupla, portanto, a pequena discrepância é apenas um erro de arredondamento hereditário de qualquer valor de ponto flutuante. Para obter um resultado preciso, gawk
precisa eliminar a manipulação de números para outros comandos que suportam números de precisão arbitrários, como bc
.
No entanto, com a atual sintaxe gawk
, é impossível fazer uma análise complexa da linha de comando do shell no gawk, portanto, seria necessário primeiro um auxiliar de script de shell. Vamos citar bc.sh
:
#!/bin/bash
echo -e "ibase=16\n$1" | bc -q
Este script alimenta ibase=16
e o primeiro argumento (número hexadecimal) em bc
, de modo que bc
produz o número decimal correspondente. Então gawk
seria chamado assim:
gawk 'BEGIN {FS=OFS=","} { "./bc.sh " toupper($3) | getline b; print $1,$2,b}' file.db
Isso diz a gawk
para chamar o script de shell com $ 3 ( bc
não suporta valor hexadecimal), armazenar o resultado na variável b
e imprimir todos os argumentos de uma só vez.
Esteja ciente de que ./bc.sh
deve ter algum espaço anexado dentro de aspas duplas, caso contrário, ele tentará executar um arquivo inexistente como ./bc.sh110000103E21CC4
.