1

Я пытаюсь сценарий базы данных из сетевого потока. Поток сети после того, как он был сильно седим, сбрасывает файл из трех столбцов, который выглядит примерно так: 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 ответа2

0

Внутренне 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 .

0

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

создание 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .