如何将包含大量十六进制数的文件转换为十进制数?
例如: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