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

Bash 从类似csv的txt文件将十六进制转换为十进制,bash,awk,Bash,Awk,我使用的是bash终端,我有一个.txt文件,其中有三列十六进制数,用空格分隔。我想把它们转换成十进制数。我在这里尝试了最后一个命令,但它只转换第一列,在列之间加逗号,在第二列和第三列上加0。 为了更清楚地了解我拥有的和我想要的: 30c8 ffbc 3e80 30c8 ffbc 3e81 输入 30c8 ffbc 3e80 30c8 ffbc 3e81 输出: 30c8 ffbc 3e80 30c8 ffbc 3e81

我使用的是bash终端,我有一个.txt文件,其中有三列十六进制数,用空格分隔。我想把它们转换成十进制数。我在这里尝试了最后一个命令,但它只转换第一列,在列之间加逗号,在第二列和第三列上加0。 为了更清楚地了解我拥有的和我想要的:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
输入

30c8 ffbc 3e80        
30c8 ffbc 3e81     
输出:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
12488 65468 16000
12488 65468 16001
由于
printf“%d”0xFF
返回255,依此类推,您可以执行以下操作:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
$ 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

您使用的是另一个分隔符,在原始问题中,分隔符是“,”-您使用的是空白

30c8 ffbc 3e80        
30c8 ffbc 3e81     
请尝试以下命令:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' input

gawk——使用
gawk

30c8 ffbc 3e80        
30c8 ffbc 3e81     
gawk --non-decimal-data '{for(i=1;i<=NF;i++) $i=sprintf("%d","0x"$i)}1' file
12488 65468 16000
12488 65468 16001

gawk——非十进制数据{for(i=1;i另一种方法是:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
$ while read a b c; do echo $((16#$a)) $((16#$b)) $((16#$c)); done < inputfile
12488 65468 16000
12488 65468 16001
$whilereadabc;do echo$((16#$a))$((16#$b))$((16#$c));done
awk
中,您将执行以下操作:

30c8 ffbc 3e80        
30c8 ffbc 3e81     
$ awk '{for(i=1;i<=NF;i++)printf "%d%s",strtonum("0x"$i),(i==NF?RS:FS)}' file
12488 65468 16000
12488 65468 16001

$awk'{for(i=1;ii忘了说我修改了我使用的命令。我将“5”改为“1”,将“7”改为“4”。默认情况下,
BEGIN
块不会在这里执行任何操作,因为
OFS==FS
,最好使用
它是正确的。我试图向用户展示与他复制的命令的真正区别。我正在按照您的建议编辑我的答案。此解决方案比其他解决方案更干净。您也可以使用
$(0x$a))
用于十六进制。回答得很好。谢谢。