【问题标题】:convert first column from hex to decimal using awk使用 awk 将第一列从十六进制转换为十进制
【发布时间】:2015-08-22 22:06:25
【问题描述】:

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

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

【问题讨论】:

    标签: regex linux awk sed hex


    【解决方案1】:

    使用 GNU awk:

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

    这有点混蛋:"0x" $10x 和第一个字段连接为字符串,sprintf 然后继续将其解释为一个数字,由于0x--non-decimal-data,它被解析为十六进制.这仅适用于 GNU awk。

    或者,考虑使用 Perl:

    perl -pe 's/^[[:xdigit:]]+/hex($&)/e' filename
    

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

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

    【讨论】:

    • 这可行,但存在无法正确对齐第一列上的值的问题,这会使整个转储未对齐。
    【解决方案2】:

    awkstrtonum 函数可以解决这个问题:

    awk 'BEGIN{FS=OFS=":"} {$1=strtonum("0x" $1)} 1' file
    3054239830: aaa1 bb1 ccc1 ddd1 eee1 fff
    3054239830: aaa2 bb2 ccc2 ddd2 eee2 fff
    3054239831: aaa3 bb3 ccc3 ddd3 eee3 fff
    3054239832: aaa4 bb4 ccc4 ddd4 eee4 fff
    3054239833: aaa5 bb5 ccc5 ddd5 eee5 fff
    

    【讨论】:

    【解决方案3】:

    试试:

    $ awk --non-decimal-data -F':' '{printf "%d:%s\n", "0x" $1, $2}' INPUT
    3054239830: aaa1 bb1 ccc1 ddd1 eee1 fff
    3054239830: aaa2 bb2 ccc2 ddd2 eee2 fff
    3054239831: aaa3 bb3 ccc3 ddd3 eee3 fff
    3054239832: aaa4 bb4 ccc4 ddd4 eee4 fff
    3054239833: aaa5 bb5 ccc5 ddd5 eee5 fff
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 2011-06-04
      • 2011-12-25
      • 2014-12-31
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多