Linux shell utils:将十六进制列表转换为十进制列表

osg*_*sgx 7 linux bash shell-script

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

示例:文件 1

 0x59999
 0x5acdc
 0xffeff
Run Code Online (Sandbox Code Playgroud)

我想开始

$ cat file1 | util | cat >file2
Run Code Online (Sandbox Code Playgroud)

并使用以下内容获取 file2:

 1021489
 1249230
 3458080
Run Code Online (Sandbox Code Playgroud)

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

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

perl -pe '$_=hex;$_.="\n"'
Run Code Online (Sandbox Code Playgroud)

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

Den*_*son 7

John T 的答案是进行十六进制转换的方法,但您也可以这样做(也可以用于其他基数):

$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Run Code Online (Sandbox Code Playgroud)

示范:

$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Run Code Online (Sandbox Code Playgroud)

编辑:

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

与 John T 的答案相比,唯一的优势是可以轻松地将其调整为将其他基数转换为十进制。他的速度要快一些。

这个gawk命令似乎比 John 的 shell 版本快一点:

gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
Run Code Online (Sandbox Code Playgroud)

它与您的 Perl 命令的速度大致相同。为什么不直接使用它?

顺便说一句,Perl one-liner 的最后一部分可以替换为以下-l选项:

perl -lpe '$_=hex'
Run Code Online (Sandbox Code Playgroud)

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

util < file1 > file2
Run Code Online (Sandbox Code Playgroud)

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

prog1 < file1 | util | prog2 > file2
Run Code Online (Sandbox Code Playgroud)

那么你就不会有人抱怨cat.