Как сделать вычисления по шестнадцатеричным числам с помощью awk? - PullRequest
6 голосов
/ 10 сентября 2010

У меня есть файл, содержащий список шестнадцатеричных чисел, например 0x12345678 по одному на строку.

Я хочу сделать расчет по ним. Для этого я подумал об использовании awk. Но если печать шестнадцатеричного числа с помощью awk легко с помощью функции printf, я не нашел способа интерпретировать шестнадцатеричный ввод, кроме как текст (или 0, преобразование в целое число останавливается на x ).

awk '{ print $1; }'                     // 0x12345678
awk '{ printf("%x\n", $1)}'             // 0
awk '{ printf("%x\n", $1+1)}'           // 1                 // DarkDust answer
awk '{ printf("%s: %x\n", $1, $1)}'     // 0x12345678: 0

Можно ли распечатать, например, значение +1?

awk '{ printf(%x\n", ??????)}'          // 0x12345679

Редактировать : приветствуются один вкладыш на других языках! (если разумная длина ;-))

Ответы [ 4 ]

18 голосов
/ 10 сентября 2010

В оригинальных реализациях nawk и mawk распознаются шестнадцатеричные (и восьмеричные) числа. gawk (который, я полагаю, вы используете) имеет особенность / ошибка, не делать этого. Он имеет переключатель командной строки, чтобы получить желаемое поведение: --non-decimal-data.

echo 0x12345678 | mawk '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 12345678

echo 0x12345678 | gawk '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 0

echo 0x12345678 | gawk --non-decimal-data '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 12345678
7 голосов
/ 10 сентября 2010

gawk имеет функцию strtonum:

% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }'
0x12345678: 0 - 12345678
3 голосов
/ 24 сентября 2012

Может быть, вам вообще не нужен awk , поскольку преобразование строки / числа волосатое. Bash версии 3 и 4 очень мощные. Часто бывает проще, понятнее и портативнее оставаться в Bash , и, возможно, использовать grep и cut и т. Д.

Например, в Bash шестнадцатеричные числа преобразуются естественным образом:

$ printf "%d" 0xDeadBeef
3735928559
$ x='0xE'; printf "%d %d %d" $x "$x" $((x + 1))
14 14 15

Надеюсь, это поможет.

1 голос
/ 10 сентября 2010

Вы можете преобразовать строку в число, просто выполнив $1 + 0. AWK автоматически преобразует строку в число по мере необходимости. Так что вы можете сделать:

awk '{ printf "%X\n", $1+1; }'

или, если хотите, 0x1234 запись:

awk '{ printf "0x%X\n", $1+1; }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...