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

Comparing hexadecimal values with awk

我在使用 awk 和比较值时遇到问题。这是一个最小的例子:

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

输出 1 而不是 0。我究竟做错了什么 ?我应该如何比较这些值?

谢谢,

您需要将 </code> 和 <code> 转换为字符串以强制执行字母数字比较。这可以通过简单地向它们附加一个空字符串来完成:

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

否则 awk 将执行数值比较。 awk 在这种情况下需要将它们转换为数值。在 awk 中将这些值转换为数字会导致 0 - 由于前导零,它们被视为八进制数但解析为八进制数失败,因为包含八进制数中不允许的无效数字的值,结果为 0。您可以使用以下命令验证:

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

要将表示十六进制数字的字符串转换为数值,您需要做两件事:在字符串前加上 "0x" 前缀并使用 strtonum() 函数。

演示:

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

我们可以看到,天真地将字符串视为数字,awk 认为它们的值为 0。这是因为第一个非数字之前的数字恰好只是零。

参考:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
请注意,strtonum 是 GNU awk 扩展

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

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

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

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

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