如何在gawk
中将数字指定为二进制?
根据manual,gawk
将所有数字解释为十进制,除非它们前面有0
(八进制)或0x
(十六进制)。与某些其他语言不同,0b
无法解决问题。
例如,以下行不提供所需的输出(010000
或10000
),因为这些值分别被解释为八进制/十进制或十进制/十进制:
gawk '{print and(010000,110000)}'
0
gawk '{print and(10000,110000)}'
9488
我怀疑gawk
可能不支持base-2,并且需要用户定义的函数来生成二进制表示。
答案 0 :(得分:2)
你是对的,gawk中没有内部支持二进制转换。令人难以置信的是,printf()
中甚至没有。所以你坚持使用功能。
请记住,awk是weakly typed。这就是为什么函数有疯狂的行为,比如识别字符串开头的“0x”意味着它是十六进制数。在这样的语言中,最好控制自己的类型。
这是我多年来一直坐着的几个功能......
#!/usr/local/bin/gawk -f
function bin2dec(n) {
result = 0;
if (n~/[^01]/) {
return n;
}
for (i=length(n); i; i--) {
result += 2^(length(n)-i) * substr(n,i,1);
}
return result;
}
function dec2bin(n) {
result = "";
while (n) {
if (n%2) {
result = "1" result;
} else {
result = "0" result;
}
n = int(n/2);
}
return result;
}
{
print dec2bin( and(bin2dec($1),bin2dec($2)) );
}
结果:
$ echo "1101 1011" | ./doit.awk
1001
$ echo "11110 10011" | ./doit.awk
10010
$