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)
有更好的解决方案吗?真正的任务是需要能够对十六进制数字进行排序。
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
.
归档时间: |
|
查看次数: |
7816 次 |
最近记录: |