Как преобразовать столбец hex в dec в gawk, strtonum в gawk дает ошибочные результаты

Я пытаюсь сценарий базы данных из сетевого потока. Поток сети после того, как он был в большой степени sed, удаляет файл из трех столбцов, который выглядит примерно так: file.db

123.123.123.123, имя компьютера, 110000103e21cc4

123.123.123.124, computer2,11000010416200f

123.123.123.1, computer3,110000106eb3f43

я пытался использовать эту команду gawk безрезультатно

gawk 'BEGIN {FS=OFS=","} {print $1,$2,strtonum("0x"$3)}' file.db

вывод из вышеперечисленного выглядит следующим образом

123.123.123.123, имя компьютера, 76561198025415874

123.123.123.124, computer2,76561198028824592

123.123.123.1, computer3,76561198076346171

однако вывод должен преобразовываться в это

123.123.123.123, имя компьютера, 76561198025415876

123.123.123.124, computer2,76561198028824591

123.123.123.1, computer3,76561198076346179

вывод всегда отключен на небольшую величину, поэтому я предполагаю, что какая-то библиотека в системе неверна... кстати, это встроенная система, на которой она работает, и я знаю, что она может конвертироваться, потому что я сделал это с помощью bc, printf, и т. д.

Как я могу сделать эту работу

2 ответа

Я оглядываюсь назад на это, и то, как я это сделал,

создание bash-скрипта вроде так называемого convert12345678.sh

#!/opt/bin/bash
(echo -e "ibase=16\nobase=0A" ; echo $1 | tr 'a-z' 'A-Z') | bc | tr "\n" " " | sed 's/\ //g'

и затем в gawk для того, что мне нужно было сказать, как в операторе (я сильно изменил эту программу с тех пор) было что-то вроде этого, и я передал эту программу, но я продемонстрирую из файла

gawk -F, '{printf("%s,%s,",$1,$2)};{system("/files/convert12345678 "$3)};{printf("\n")}' file.db

я сделал это таким образом, удалив новую строку в bash-скрипте, потому что, честно говоря, я переместил ее потом, размещение выполнения скрипта, то есть, таким образом, я бы не вставлял символ новой строки в вывод сразу после преобразования, если я не хотел, чтобы Printf

Внутренне gawk сохраняет преобразованное значение в плавающей запятой двойной точности, поэтому небольшое расхождение просто является ошибкой округления, присущей любому значению с плавающей запятой. Чтобы получить точный результат, gawk необходимо обработать исходящие числа другим командам, которые поддерживают числа произвольной точности, такие как bc,

Однако при нынешнем gawk Синтаксис Невозможно выполнить сложный синтаксический анализ командной строки в gawk, поэтому сначала потребуется помощник сценария оболочки. Давайте назовем это bc.sh:

#!/bin/bash
echo -e "ibase=16\n$1" | bc -q

Этот сценарий кормит ibase=16 и первый аргумент (шестнадцатеричное число) в bc, чтобы bc выводит соответствующее десятичное число. затем gawk будет называться так:

gawk 'BEGIN {FS=OFS=","} { "./bc.sh " toupper($3) | getline b; print $1,$2,b}' file.db

Это говорит gawk вызвать скрипт оболочки с $3 в верхнем регистре (bc не поддерживает шестнадцатеричное значение в нижнем регистре), сохраните результат в b переменная, и выведите все аргументы за один раз.

Остерегайтесь этого ./bc.sh должно быть добавлено некоторое пространство в двойных кавычках, иначе он попытается выполнить несуществующий файл, такой как ./bc.sh110000103E21CC4,

Другие вопросы по тегам