2015-02-17 2 views

ответ

2

Вы должны преобразовать $1 и $2 в строки для обеспечения выполнения буквенно-цифровые сравнения. Это может быть сделано, просто добавьте пустую строку к ним:

echo "0000e149 0000e152" | awk '{print($1""==$2"")}' 

В противном случае awk бы выполнить численное сравнение. awk необходимо будет преобразовать их в числовые значения в этом случае. Преобразование этих значений в числа в awk приводит к 0 - из-за начального нуля (ов) они рассматриваются как восьмеричные числа, но синтаксический анализ по восьмеричному номеру терпит неудачу, поскольку значения, содержащие недопустимые цифры, которые недопустимы в восьмеричных числах, что приводит к 0. Вы можете убедиться в том, что с помощью следующей команды:

echo "0000e149 0000e152" | awk '{print $1+0; print $2+0)}' 
0 
0 
+0

не было, что просто сравнить строки "$ 1" на "$ 2"? Это то, что он делает на моем компьютере. – Jokyjo

+0

О! Ты прав! Я обновил ответ. – hek2mgl

3

Чтобы преобразовать строку, представляющую шестнадцатеричное число для числового значения, вам необходимо 2 вещи: префикс строки с "0x" и использовать функцию strtonum().

Чтобы продемонстрировать:

echo "0000e149 0000e152" | gawk '{ 
    print $1, $1+0 
    print $2, $2+0 
    n1 = strtonum("0x" $1) 
    n2 = strtonum("0x" $2) 
    print $1, n1 
    print $2, n2 
}' 
0000e149 0 
0000e152 0 
0000e149 57673 
0000e152 57682 

Мы можем видеть, что наивно рассматривая строки как числа, AWK считает их значение 0. Это происходит потому, что цифры, предшествующие первые нецифровой случаются быть только нулями.

Ref: https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
Обратите внимание, что StrToNum является расширением GNU AWK

+0

Спасибо за подробное объяснение! Хотя, я поеду на другое решение, так как просто хочу сравнить равенство, а не числовое. :) – Jokyjo

+0

Достаточно честный. Тестирование равенства строк, безусловно, будет быстрее, чем числовое преобразование. –

1

При использовании недесятичных данных нужно просто сказать поглазеть, что это то, что вы делаете, и определить, что база, которую вы используете в каждом номере :

$ echo "0xe152 0x0000e152" | awk --non-decimal-data '{print($1==$2)}' 
1 

$ echo "0xE152 0x0000e152" | awk --non-decimal-data '{print($1==$2)}' 
1 

$ echo "0xe149 0x0000e152" | awk --non-decimal-data '{print($1==$2)}' 
0 

См http://www.gnu.org/software/gawk/manual/gawk.html#Nondecimal-Data

Смежные вопросы