Conversion hexadécimale en décimale dans Bash

2

Ceci est la sortie courante dans un fichier texte

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

mais la sortie désirée est (après conversion hexadécimale)

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

Le problème est le suivant: je peux effectuer la conversion à l'aide de la commande suivante, mais la sortie écrite dans le fichier texte est à nouveau identique (en réalité deux fois!), Mais je m'attends à ce que les données converties soient réécrites dans le fichier.

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' ' '
Linux Lover
la source

Réponses:

2

Solution Perl:

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

Si les espaces sont significatifs, vous aurez peut-être besoin de celui-ci:

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

Voici une solution utilisant awk seulement:

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

Il produira:

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

Remarque: Cela ne fonctionnera pas sur place, si vous avez vraiment besoin de ce que vous pouvez résoudre avec:

    mv file_name.txt file_name.tmp
    awk '...' file_name.tmp > file_name.txt
    rm file_name.tmp
cYrus
la source
0

en utilisant 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
kev
la source
0

L'erreur que vous faites est dans la première commande.

Lorsque vous dites «sed p file.txt -i», cela signifie:

Pour chaque ligne du fichier, imprimez la ligne; enregistrer la sortie dans le fichier avec l'original. Cette commande duplique chaque ligne et est loin de ce que vous vouliez.

il suffit de mettre trois lignes dans un fichier comme celui-ci:

1
2
3

puis exécutez le fichier sed p -i. vous allez vous retrouver avec:

1
1
2
2
3
3

Ярослав Рахматуллин
la source