从类似csv的txt文件中将十六进制转换为十进制

时间:2013-09-19 12:58:41

标签: bash awk

我正在使用bash终端,我有一个.txt文件,其中我有三列十六进制数字用空格分隔。我想将它们转换为十进制数。我从这里Converting hexadecimal to decimal using awk or sed尝试了最后一个命令,但它仅转换第一列,在列中添加逗号并在第二列和第三列上放置0。 更清楚地知道我拥有什么和我想要什么:

输入

30c8 ffbc 3e80        
30c8 ffbc 3e81     

输出:

12488 65468 16000
12488 65468 16001

5 个答案:

答案 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个变量,然后将其保存为pqr。然后我们用上面的表格打印它们,以便它们打印成十进制。

如果您有其他字段分隔符,可以使用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