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

时间:2015-02-17 17:22:03

标签: awk

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

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

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

谢谢,

3 个答案:

答案 0 :(得分:3)

要将表示十六进制数字的字符串转换为数字值,您需要两件事:在字符串前加上"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.这是因为第一个非数字前面的数字恰好只是零。

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

答案 1 :(得分:2)

您需要将$1$2转换为字符串才能执行字母数字比较。这可以通过简单地向它们添加一个空字符串来完成:

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

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

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

答案 2 :(得分:1)

使用非十进制数据时,您只需告诉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

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