Konwersja szesnastkowa na dziesiętną w Bash

2

To jest bieżące wyjście w pliku tekstowym

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

ale pożądanym wyjściem jest (po konwersji heksadec na dec)

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

Problem polega na tym: jestem w stanie wykonać konwersję za pomocą następującego polecenia, ale dane wyjściowe zapisane ponownie w pliku tekstowym są znowu takie same (właściwie dwa razy!), Ale spodziewam się, że przekonwertowane dane zostaną zapisane ponownie w pliku.

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' ' '
Miłośnik Linuksa
źródło

Odpowiedzi:

2

Rozwiązanie Perla:

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

Jeśli spacja jest znacząca, możesz potrzebować tego:

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

Oto rozwiązanie wykorzystujące awktylko:

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

Będzie produkować:

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

Uwaga: To nie zadziała w miejscu, jeśli naprawdę potrzebujesz rozwiązania tego problemu:

    mv nazwa_pliku.txt nazwa_pliku.tmp
    awk '...' nazwa_pliku.tmp> nazwa_pliku.txt
    rm nazwa_pliku.tmp
Cyrus
źródło
0

za pomocą 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
źródło
0

Błąd, który popełniasz jest w pierwszym poleceniu.

Kiedy mówisz `sed p file.txt -i ', oznacza to:

Dla każdej linii w pliku wydrukuj linię; zapisz wynik w pliku wraz z oryginałem. To polecenie powiela każdą linię i jest dalekie od zamierzonego.

po prostu umieść trzy linie w takim pliku:

1
2
3

następnie uruchom plik sed p -i. skończysz z:

1
1
2
2
3
3

Ярослав Рахматуллин
źródło