Hexadecimal para conversão decimal em Bash

2

Esta é a saída atual em um arquivo de texto

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

mas a saída desejada é (depois da conversão hexadecimal)

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

O problema é: Eu sou capaz de fazer a conversão usando o seguinte comando, mas a saída escrita no arquivo de texto é novamente a mesma (na verdade duas vezes!), mas espero que os dados convertidos sejam gravados no arquivo.

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' ' '
    
por Linux Lover 16.12.2011 / 12:59

4 respostas

2

Solução de Perl:

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

Se o espaço em branco for significativo, você pode precisar deste:

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

Aqui está uma solução usando awk apenas:

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

Produzirá:

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

Observação: isso não funcionará no local, se você realmente precisar resolver isso com:

    mv file_name.txt file_name.tmp
    awk '...' file_name.tmp > file_name.txt
    rm file_name.tmp
    
por 16.12.2011 / 13:46
0

usando 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
    
por 21.12.2011 / 13:46
0

O erro que você está cometendo está no primeiro comando.

Quando você diz "sed p file.txt -i", isso significa:

Para cada linha no arquivo, imprima a linha; salve a saída no arquivo junto com o original. Este comando duplica todas as linhas e está longe do que você pretendia.

basta colocar três linhas em um arquivo como este:

1
2
3

execute o sed p file -i. você vai acabar com:

1
1
2
2
3
3

    
por 14.10.2012 / 00:50