我正在使用 bash 终端,并且我有一个 .txt 文件,其中有三列十六进制数字,由空格分隔。我想将它们转换为十进制数字。我尝试了从这里使用 awk 或 sed 将十六进制转换为十进制的最后一个命令,但它只转换第一列,在列之间放置一个逗号,并在第二列和第三列上放置一个 0。更清楚地了解我拥有什么和想要什么:
输入
30c8 ffbc 3e80
30c8 ffbc 3e81
输出:
12488 65468 16000
12488 65468 16001
我正在使用 bash 终端,并且我有一个 .txt 文件,其中有三列十六进制数字,由空格分隔。我想将它们转换为十进制数字。我尝试了从这里使用 awk 或 sed 将十六进制转换为十进制的最后一个命令,但它只转换第一列,在列之间放置一个逗号,并在第二列和第三列上放置一个 0。更清楚地了解我拥有什么和想要什么:
输入
30c8 ffbc 3e80
30c8 ffbc 3e81
输出:
12488 65468 16000
12488 65468 16001
另一种方法是说:
$ while read a b c; do echo $((16#$a)) $((16#$b)) $((16#$c)); done < inputfile
12488 65468 16000
12488 65468 16001
您正在使用另一个分隔符,在原始问题中,分隔符是“,” - 您使用了一个空格。
试试这个命令:
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' input
作为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
使用gawk
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' file
12488 65468 16000
12488 65468 16001
在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