2010-09-10 434 views
4

我有一個包含十六進制數字列表的文件,如0x12345678每行一個。如何用awk對十六進制數進行計算?

我想對它們進行計算。爲此,我想到了使用awk。但如果用awk打印十六進制數字很容易使用printf函數,我還沒有找到一種方法來解釋十六進制輸入而不是文本(或0,轉換爲整數在x停止)。

awk '{ print $1; }'      // 0x12345678 
awk '{ printf("%x\n", $1)}'    // 0 
awk '{ printf("%x\n", $1+1)}'   // 1     // DarkDust answer 
awk '{ printf("%s: %x\n", $1, $1)}'  // 0x12345678: 0 

是否可以打印,例如:值+1?

awk '{ printf(%x\n", ??????)}'   // 0x12345679 

編輯:在其他語言中的一種襯裏的歡迎! (如果合理長度;-))

回答

15

在原有nawkmawk實現十六進制(和八進制)數的認可。 gawk(我猜你正在使用)有沒有這樣做的功能/錯誤。它有一個命令行開關來獲得你想要的行爲:--non-decimal-data

echo 0x12345678 | mawk '{ printf "%s: %x\n", $1, $1 }' 
0x12345678: 12345678 

echo 0x12345678 | gawk '{ printf "%s: %x\n", $1, $1 }' 
0x12345678: 0 

echo 0x12345678 | gawk --non-decimal-data '{ printf "%s: %x\n", $1, $1 }' 
0x12345678: 12345678 
0

只需通過執行$1 + 0即可將字符串轉換爲數字。 AWK根據需要自動將字符串轉換爲數字。所以,你可以這樣做:

awk '{ printf "%X\n", $1+1; }' 

,或者如果你想0x1234符號:

awk '{ printf "0x%X\n", $1+1; }' 
+0

這不適用於我的Linux系統(debian):它打印出1.我的猜測是,awk嘗試將值解釋爲十進制,並在x後面的0處停止,忽略0x是十六進制符號前綴。 – 2010-09-10 08:27:25

6

GAWK具有strtonum功能:

% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }' 
0x12345678: 0 - 12345678 
3

也許你並不需要AWK所有的,因爲串/數轉換毛。 Bash版本3和4非常強大。它往往是更簡單,更清晰,更便攜留在猛砸,也許使用的grep削減

例如,在猛砸十六進制數字自然轉換:

$ printf "%d" 0xDeadBeef 
3735928559 
$ x='0xE'; printf "%d %d %d" $x "$x" $((x + 1)) 
14 14 15 

希望這有助於。