двоичные числа в gawk

Как можно указать число как двоичное в gawk?

Согласно руководству, gawk интерпретирует все числа как десятичные, если они которым предшествует 0 (восьмеричное) или 0x (шестнадцатеричное). В отличие от некоторых других языков, 0b не помогает.

Например, следующие строки не дают желаемого результата (010000 или 10000), потому что значения интерпретируются как восьмеричные/десятичные или десятичные/десятичные соответственно:

gawk '{print and(010000,110000)}'
0

gawk '{print and(10000,110000)}'
9488

Я подозреваю, что gawk может не поддерживать основание 2 и что для создания двоичных представлений потребуется определяемая пользователем функция.


person user001    schedule 26.10.2012    source источник


Ответы (1)


Вы правы, в gawk нет внутренней поддержки двоичного преобразования. И невероятно, в printf() их нет. Итак, вы застряли с функциями.

Помните, что awk слабо типизирован. Вот почему функции ведут себя безумно, например, распознавая, что «0x» в начале строки означает, что это шестнадцатеричное число. В таком языке лучше контролировать свои собственные типы.

Вот пара функций, которые я сидел без дела годами...

#!/usr/local/bin/gawk -f

function bin2dec(n) {
  result = 0;
  if (n~/[^01]/) {
    return n;
  }
  for (i=length(n); i; i--) {
    result += 2^(length(n)-i) * substr(n,i,1);
  }
  return result;
}

function dec2bin(n) {
  result = "";
  while (n) {
    if (n%2) {
      result = "1" result;
    } else {
      result = "0" result;
    }
    n = int(n/2);
  }
  return result;
}

{
  print dec2bin( and(bin2dec($1),bin2dec($2)) );
}

И результат:

$ echo "1101 1011" | ./doit.awk
1001
$ echo "11110 10011" | ./doit.awk
10010
$ 
person ghoti    schedule 04.12.2012