Bash 中的十六进制到十进制的转换

Bash 中的十六进制到十进制的转换

这是文本文件中的当前输出

1            3.491136  C1 00 08 00 DD 92 01 FF
2            3.560963  C1 00 08 00 DD 92 01 FF
3            3.600959  C1 00 08 00 DD 92 01 FF
4            3.640694  01 00
5            3.680950  C1 00 08 00 DD 92 01 FF
6            3.720947  C1 00 08 00 DD 92 01 FF
7            3.760941  C1 00 08 00 DD 92 01 FF
8            3.780677  01 00
9            3.800937  C1 00 08 00 DD 92 01 FF

但所需的输出是(十六进制到十进制转换后)

1            3.491136  193 0 8 0 221 146 1 255
2            3.560963  193 0 8 0 221 146 1 255
3            3.600959  193 0 8 0 221 146 1 255
4            3.640694  1   0
5            3.680950  193 0 8 0 221 146 1 255
6            3.720947  193 0 8 0 221 146 1 255
7            3.760941  193 0 8 0 221 146 1 255
8            3.780677  1   0
9            3.800937  193 0 8 0 221 146 1 255

问题是:我能够使用以下命令进行转换,但写回到文本文件中的输出再次相同(实际上是两次!),但我希望转换后的数据能够写回到文件中。

sed p file_name.txt -i |tr '[a-z]' '[A-z]' |sed 's/ / p /g' |sed 's/$/ p/'|awk '{print "16i "$0}'|dc |tr '\n' ' '

答案1

Perl 解决方案:

perl -nlae '$, = " "; print @F[0,1], map {hex} @F[2..$#F]'

如果空白很重要,则可能需要这个:

perl -lne '($x, $y) = /(^[0-9]+\s*[0-9.]+\s*)([[:alnum:]\s]+)/;
           print $x, map {/\s/ ? $_ : hex} split(/( +)/, $y)'

答案2

这是一个awk仅使用以下方法的解决方案:

awk '{ printf "%s%20s  ", $1, $2; for(i=3;i<=NF;i++) printf "%-4d", "0x"$i; print "" }' file_name.txt

它将产生:

1 3.491136 193 0 8 0 221 146 1 255
2 3.560963 193 0 8 0 221 146 1 255
3 3.600959 193 0 8 0 221 146 1 255
4 3.640694 1 0  
5 3.680950 193 0 8 0 221 146 1 255
6 3.720947 193 0 8 0 221 146 1 255
7 3.760941 193 0 8 0 221 146 1 255
8 3.780677 1 0  
9 3.800937 193 0 8 0 221 146 1 255

笔记:这无法就地工作,如果你真的需要,你可以用以下方法解决:

    mv 文件名.txt 文件名.tmp
    awk'...'文件名.tmp>文件名.txt
    rm 文件名.tmp

答案3

使用ex

$ echo -e "%s/\<\x\x\>/\=printf('%d', '0x'.submatch(0))/g\n%p" | ex file.txt | column -t
1  3.491136  193  0  8  0  221  146  1  255
2  3.560963  193  0  8  0  221  146  1  255
3  3.600959  193  0  8  0  221  146  1  255
4  3.640694  1    0
5  3.680950  193  0  8  0  221  146  1  255
6  3.720947  193  0  8  0  221  146  1  255
7  3.760941  193  0  8  0  221  146  1  255
8  3.780677  1    0
9  3.800937  193  0  8  0  221  146  1  255

答案4

您所犯的错误是在第一个命令中。

当你说“sed p file.txt -i”时,这意味着:

对于文件中的每一行,打印该行;将输出与原始内容一起保存在文件中。此命令会复制每一行,这与您的预期相差甚远。

只需在文件中放入三行即可:

1
2
3

然后运行 ​​sed p file -i。你将得到:

1
1
2
2
3
3

相关内容