我遇到了awk和比较值的问题。这是一个最小的例子:
echo "0000e149 0000e152" | awk '{print($1==$2)}'
哪个输出1
而不是0
。我究竟做错了什么 ?我该如何比较这些值?
谢谢,
答案 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