在文本文件中将十六进制值转换为十进制

时间:2015-03-13 18:04:43

标签: bash awk sed

我有一个文本文件,如下所示:

RAM_SIZE 3128
RAM_ADDRESS_WIDTH 0xF
MTFE 0xF
IPS_ADDR_WIDTH 314

我想将十六进制值转换为十进制并显示如下内容:

RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314

我试过用awk:

#!/bin/awk -f
{
  if ($2 == "0x*")
    printf "%s %d \n", $1, $3 ;
  else 
    print $1 " " $2 
}

如果是这种情况,则无法正确使用通配符。

我也想使用sed,但我不知道如何在sed表达式中使用列号:

sed -e 's/0x*/$(($2))/' 

2 个答案:

答案 0 :(得分:2)

-n告诉GNU awk处理非十进制数据:

$ gawk -n '{$2+=0}1' file        
RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314

你的陈述Not able to use wildcards properly in if case.,你写道:

if ($2 == "0x*")

,其中

"0x*" is a STRING containing the characters "0", "x", and "*".
== is the STRING comparison operator.

你想要的是一个正则表达式比较,而不是一个字符串,所以你应该从写作开始:

if ($2 ~ /0x*/)

自:

/0x*/ is a REGEXP that means `0 then x repeated zero or more times`
~ is the REGEXP comparison operator

但我怀疑你并不真正想要*以及你真正想要的是:

if ($2 ~ /^0x/)

自:

/^0x/ is a REGEXP that means `starting with 0 and followed by x`

答案 1 :(得分:1)

使用gnu-awk非常简单:

awk '{print $1, strtonum($2)}' file
RAM_SIZE 3128
RAM_ADDRESS_WIDTH 15
MTFE 15
IPS_ADDR_WIDTH 314