代码之家  ›  专栏  ›  技术社区  ›  Didier Trosset

如何用awk计算十六进制数?

  •  6
  • Didier Trosset  · 技术社区  · 14 年前

    我有一个包含十六进制数列表的文件,如 0x12345678 每行一个。

    我想对它们进行计算。为此,我想用 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
    

    编辑 :欢迎使用其他语言的一句话!(如果合理长度;-)

    4 回复  |  直到 11 年前
        1
  •  18
  •   schot    14 年前

    原文中 nawk mawk 实现可以识别十六进制(和八进制)数字。 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
    
        2
  •  7
  •   glenn jackman    14 年前

    呆子有 strtonum 功能:

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

    也许你不需要 AWK 毕竟,由于字符串/数字转换是多毛的。 猛击 版本3和4非常强大。它通常更简单、更清晰、更便于携带。 猛击 也许还用 格雷普 等。

    例如,在 猛击 十六进制数自然转换:

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

    希望这有帮助。

        4
  •  1
  •   DarkDust    14 年前

    只需执行以下操作,就可以将字符串转换为数字 $1 + 0 . awk根据需要自动将字符串转换为数字。所以你可以这样做:

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

    或者如果你想要 0x1234 表示法:

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