使用awk将第一列从十六进制转换为十进制

时间:2015-06-08 12:27:40

标签: linux shell awk sed hex

我有一个日志文件,其中包含第一列中十六进制的日志时间戳,然后在其余列中记录文本。例如:

B60C0056: aaa1 bb1 ccc1 ddd1 eee1 fff
B60C0056: aaa2 bb2 ccc2 ddd2 eee2 fff
B60C0057: aaa3 bb3 ccc3 ddd3 eee3 fff
B60C0058: aaa4 bb4 ccc4 ddd4 eee4 fff
B60C0059: aaa5 bb5 ccc5 ddd5 eee5 fff

我需要将第一列转换为十进制,我使用以下方法执行此操作,但不知道如何为整个文件实现此操作。

while read line
do
echo -e "$line"|awk '{print $1,$2,$3,$4,$5,$6}'
done <temp

但是如何将$ 1转换为十进制值?

echo "ibase=16; `awk '{print $1}'`" | bc

3 个答案:

答案 0 :(得分:4)

awk的{​​{1}}函数可以解决这个问题:

strtonum

答案 1 :(得分:3)

使用GNU awk:

gawk --non-decimal-data '{ $1 = sprintf("%d:", "0x" $1) } 1' filename

这是一个小小的混蛋:"0x" $1连接0x,第一个字段为字符串,sprintf然后继续将其解释为一个数字,由于{被解析为十六进制数字{1}}和0x。这只适用于GNU awk。

或者,考虑使用Perl:

--non-decimal-data

这应该适用于Perl可用的任何地方(实际上应该是无处不在)。

编辑:更好的Perl解决方案。

答案 2 :(得分:2)

尝试:

{{1}}