2012-10-26 42 views
2

如何在gawk中指定數字爲二進制數?gawk中的二進制數

按照manualgawk解釋的所有數字爲十進制的,除非它們被0(八進制)之前或由0x(十六進制)。與其他某些語言不同,0b並不能解決問題。

例如,下面的線不得到所需的輸出(01000010000),因爲值被解釋爲八進制/十進制或十進制/十進制,分別爲:

gawk '{print and(010000,110000)}' 
0 

gawk '{print and(10000,110000)}' 
9488 

我懷疑gawk不得支持base-2,並且需要用戶定義的函數來生成二進制表示。

回答

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 
$