5

我正在使用 bash 终端,并且我有一个 .txt 文件,其中有三列十六进制数字,由空格分隔。我想将它们转换为十进制数字。我尝试了从这里使用 awk 或 sed 将十六进制转换为十进制的最后一个命令,但它只转换第一列,在列之间放置一个逗号,并在第二列和第三列上放置一个 0。更清楚地了解我拥有什么和想要什么:

输入

30c8 ffbc 3e80        
30c8 ffbc 3e81     

输出:

12488 65468 16000
12488 65468 16001
4

5 回答 5

5

另一种方法是说:

$ while read a b c; do echo $((16#$a)) $((16#$b)) $((16#$c)); done < inputfile
12488 65468 16000
12488 65468 16001
于 2013-09-19T13:06:16.207 回答
1

您正在使用另一个分隔符,在原始问题中,分隔符是“,” - 您使用了一个空格。

试试这个命令:

gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' input
于 2013-09-19T13:03:36.540 回答
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
于 2013-09-19T13:01:48.300 回答
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
于 2013-09-19T13:04:46.120 回答
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
于 2013-09-19T13:19:47.950 回答