将十六进制值与 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
我在使用 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