将十六进制值与awk进行比较

将十六进制值与awk进行比较,awk,Awk,我在awk和比较值方面遇到问题。下面是一个简单的例子: echo "0000e149 0000e152" | awk '{print($1==$2)}' 它输出1,而不是0。我做错了什么?我该如何比较这些值呢 谢谢,您需要将$1和$2转换为字符串,以便执行字母数字比较。这可以通过简单地向它们附加一个空字符串来实现: echo "0000e149 0000e152" | awk '{print($1""==$2"")}' 否则,awk将执行数字比较awk需要将它们转换为数值。将这些值转换为aw

我在awk和比较值方面遇到问题。下面是一个简单的例子:

echo "0000e149 0000e152" | awk '{print($1==$2)}'
它输出
1
,而不是
0
。我做错了什么?我该如何比较这些值呢


谢谢,

您需要将
$1
$2
转换为字符串,以便执行字母数字比较。这可以通过简单地向它们附加一个空字符串来实现:

echo "0000e149 0000e152" | awk '{print($1""==$2"")}'
否则,
awk
将执行数字比较<在这种情况下,code>awk需要将它们转换为数值。将这些值转换为awk中的数字会导致
0
——由于前导零,它们被视为八进制数,但解析为八进制数会失败,因为八进制数中不允许包含无效数字的值,从而导致
0
。您可以使用以下命令验证:

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

要将表示十六进制数的字符串转换为数值,需要做两件事:在字符串前面加上
“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
}'
我们可以看到,将字符串天真地视为数字,awk认为它们的值为0。这是因为第一个非数字前面的数字恰好只有零

参考:

请注意,strtonum是GNU awk扩展名

当使用非十进制数据时,您只需告诉gawk这就是您正在做的事情,并指定在每个数字中使用的基数:

$ 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

请看

这不就是比较字符串“$1”和“$2”吗?这就是它在我电脑上的作用。谢谢你的详细解释!不过,我会选择另一种解决方案,因为我只想进行等式比较,而不是数值比较。:)很公平。测试字符串是否相等肯定比数字转换要快。
$ 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