2016-09-23 369 views
1

我具有由3列與十六進制數的(值是可變的,這些僅作爲一個例子)的文本文件:awk命令爲十六進制轉換爲符號十進制

X  Y  Z 
0a0a 0b0b 0c0c 
0a0a 0b0b 0c0c 
0a0a 0b0b 0c0c 
0a0a 0b0b 0c0c 

我想這些數字轉換有符號的十進制和打印他們在相同的結構,他們都在,所以我所做的:

awk '{x="0x"$1; 
     y="0x"$2; 
     z="0x"$3; 
     printf ("%d %d %d" x,y,z);}' input_file.txt > output_file.txt 

,我得到作爲輸出僅包括無符號值的列表。

+1

由於樣本輸入中的十六進制數字全部以零字節開始,因此通常會將其視爲正數。他們中的任何一個應該被視爲否定的? – John1024

+1

你可以發佈你的預期輸出嗎?並給出的awk片段有語法問題 – Sundeep

+0

awk不支持它,嘗試使用像這裏描述的一個黑客http://stackoverflow.com/questions/37551094/awk-convert-big-unsigned-int-to-signed- int-binary來證明awk無法使用int2hex awk'{printf'%x/n「,-1}'它會告訴你ffffffffffffffff嘗試向後awk'{printf」%d/n,0xffffffffffffffff「}'你會得到一個巨大的正整數。這與shell printf命令一樣。預計產量爲 –

回答

0

您可以使用awk功能,使一個Conversion from Two's Complement

function hex2int(hexstr, nbits) 
{ 
    max = 2^nbits 
    med = max/2 

    num = strtonum("0x" hexstr) 

    return ((num < med) ? num : ((num > med) ? num - max : -med)) 
} 

4bit轉換的例子:

print hex2int("7", 4) # +7 
print hex2int("2", 4) # +2 
print hex2int("1", 4) # +1 
print hex2int("0", 4) # 0 
print hex2int("f", 4) # -1 
print hex2int("d", 4) # -3 
print hex2int("9", 4) # -7 
print hex2int("8", 4) # -8 

8bit轉換的例子:

print hex2int("7f", 8) # +127 
print hex2int("40", 8) # +64 
print hex2int("01", 8) # +1 
print hex2int("00", 8) # 0 
print hex2int("ff", 8) # -1 
print hex2int("40", 8) # -64 
print hex2int("81", 8) # -127 
print hex2int("80", 8) # -128 

把所有在一起使用16bit轉換:

#!/bin/awk 

function hex2int(hex) 
{ 
    num = strtonum("0x" hex) 

    return ((num < med) ? num : ((num > med) ? num - max : -med)) 
} 

BEGIN { 
    nbits = 16 
    max = 2^nbits 
    med = max/2 
} 

{ 
    for(i = 1; i <= NF; i++) 
    { 
     if(NR == 1) 
     { 
      printf "%s%s", $i, OFS 
     } 
     else 
     { 
      printf "%d%s", hex2int($i), OFS 
     } 
    } 

    printf "%s", ORS 
} 

# eof # 

輸入文件:

X  Y  Z 
0a0a 0b0b 0c0c 
abcd ef01 1234 
ffff fafa baba 
12ab abca 4321 

測試:

$ awk -f script.awk -- input.txt 

輸出:

X Y Z 
2570 2827 3084 
-21555 -4351 4660 
-1 -1286 -17734 
4779 -21558 17185 

參考:https://en.wikipedia.org/wiki/Two's_complement

希望它有幫助!

相關問題