Linux shell 实用程序:将十六进制列表转换为十进制列表

Linux shell 实用程序:将十六进制列表转换为十进制列表

如何将包含大量十六进制数的文件转换为十进制数?

例如:file1

 0x59999
 0x5acdc
 0xffeff

我想开始

$ cat file1 | util | cat >file2

并使用以下命令获取 file2:

 1021489
 1249230
 3458080

(示例输出中的数字是随机的,因为我无法将这么长的十六进制数转换为十进制)

更新:我使用以下 Perl 命令解决了这个问题:

perl -pe '$_=hex;$_.="\n"'

有更好的解决方案吗?真正的任务是需要能够对十六进制数进行排序。

答案1

John T 的答案是进行十六进制转换的方法,但您也可以通过以下方式进行(也可以用于其他进制):

$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001

示范:

$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342

编辑:

#!/bin/bash
base=16
while read -r val
do
    val=${val#*x}
    echo $(($base#$val))
done < inputfile > outputfile

与 John T 的答案相比,唯一的优势在于,这个答案可以很容易地适应将其他基数转换为十进制。他的答案要快得多。

gawk命令似乎比 John 的 shell 版本稍快一些:

gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile

它的速度与 Perl 命令差不多。为什么不直接使用它呢?

顺便说一下,Perl 单行命令的最后一部分可以用这个-l选项替换:

perl -lpe '$_=hex'

另一个注意事项:通常,您在问题中显示的管道将写成:

util < file1 > file2

或者,如果cat代表占位符,则应使用虚拟名称:

prog1 < file1 | util | prog2 > file2

那么就不会有人抱怨无用的用途了cat

答案2

我通常只使用 printf...

while read x;do printf '%d\n' $x;done <file

答案3

cat file1 | wcalc -q -d -EE -P0 > file2

应该首先安装 wcalc

答案4

对于较长的十六进制值,只有 Python 对我来说有效,例如:

DB50BA84BAEA0BDE2174F1607347C77337498EB90A7C1A5C4860C42A0E84D510A6437A69E7F48421BA05ADD2ED1EAD17F60CC75C12D7CEA73137BC0408AF0242E37E7EE6A4A753C01534EC7C9C9F3156FCA9D3E93FE9963E58C1A1974E70D8D287E4D279F4E3B52048332FF4B63F52ACA85A1B9BE42016C4E57FF015E0C29E9F

命令:

python -c 'print(int("DB50BA84BAEA0BDE2174F1607347C77337498EB90A7C1A5C4860C42A0E84D510A6437A69E7F48421BA05ADD2ED1EAD17F60CC75C12D7CEA73137BC0408AF0242E37E7EE6A4A753C01534EC7C9C9F3156FCA9D3E93FE9963E58C1A1974E70D8D287E4D279F4E3B52048332FF4B63F52ACA85A1B9BE42016C4E57FF015E0C29E9F", 16))'

结果:

1540084734207123874049016980314828660545005885877681191926748381131844011064771876140309318546098501843921371081270273387753567878830747946969911500758356 06063573780179056429457464518736685347520207122186156775440321726025030196545084526749015303353858750937930411164298939052722221299315903418569137408089759

相关内容