我正在使用bash终端,我有一个.txt文件,其中我有三列十六进制数字用空格分隔。我想将它们转换为十进制数。我从这里Converting hexadecimal to decimal using awk or sed尝试了最后一个命令,但它仅转换第一列,在列中添加逗号并在第二列和第三列上放置0。 更清楚地知道我拥有什么和我想要什么:
输入
30c8 ffbc 3e80
30c8 ffbc 3e81
输出:
12488 65468 16000
12488 65468 16001
答案 0 :(得分:5)
另一种方法是说:
$ while read a b c; do echo $((16#$a)) $((16#$b)) $((16#$c)); done < inputfile
12488 65468 16000
12488 65468 16001
答案 1 :(得分:1)
当printf "%d" 0xFF
返回255以后依此类推,你可以这样做:
$ while read p q r; do printf "%d %d %d\n" 0x$p 0x$q 0x$r; done < input
12488 65468 16000
12488 65468 16001
也就是说,我们在每一行读取3个变量,然后将其保存为p
,q
,r
。然后我们用上面的表格打印它们,以便它们打印成十进制。
如果您有其他字段分隔符,可以使用IFS
来表示:
$ cat a
30c8,ffbc,3e80
30c8,ffbc,3e81
$ while IFS=, read p q r; do printf "%d %d %d\n" 0x$p 0x$q 0x$r; done < a
12488 65468 16000
12488 65468 16001
答案 2 :(得分:1)
你正在使用另一个分隔符,在原始问题中,分隔符是“,” - 你使用空格。
请尝试使用此命令:
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' input
答案 3 :(得分:1)
使用gawk
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' file
12488 65468 16000
12488 65468 16001
答案 4 :(得分:0)
在awk
你会做:
$ awk '{for(i=1;i<=NF;i++)printf "%d%s",strtonum("0x"$i),(i==NF?RS:FS)}' file
12488 65468 16000
12488 65468 16001