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 .