2012-10-26 2 views
2

gawk에 어떻게 이진수로 숫자를 지정할 수 있습니까? 그들은이 0 (진수) 앞에 또는 0x (16 진수)로하지 않는gawk의 이진수

manual에 따르면, gawk 소수점 모든 숫자를 해석합니다. 다른 언어와 달리 0b은 속임수를 사용하지 않습니다. 값이 각각 진수/소수 또는 소수/진수로 해석되기 때문에

예를 들어, 다음 행이 목표 출력 (010000 또는 10000)를주지 않는다 :

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

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

I는 용의자 gawk 금지 된 base-2를 지원하고 이진 표현을 생성하기 위해 사용자 정의 함수가 필요할 것입니다.

답변

2

맞습니다. gawk에는 내부 변환이 지원되지 않습니다. 놀랍게도 printf()에는 아무 것도 없습니다. 그래서 당신은 기능에 박혀 있습니다.

awk는 weakly typed입니다. 그래서 함수가 문자열의 시작 부분에 "0x"가 16 진수임을 의미하는 것과 같은 미친 행동을하는 이유가 여기에 있습니다. 이와 같은 언어에서는 자신의 유형을보다 잘 제어 할 수 있습니다. 여기에 내가 년 동안 앉아 있었다 한 기능의 몇입니다

...

#!/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 
$ 
관련 문제