2

Это текущий вывод в текстовом файле

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' ' '

4 ответа4

2

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)'
1

Вот решение, использующее только 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 file_name.txt file_name.tmp
    awk '...' file_name.tmp > file_name.txt
    rm file_name.tmp
0

Вы делаете ошибку в первой команде.

Когда вы говорите `sed p file.txt -i ', это означает:

Для каждой строки в файле выведите строку; сохранить вывод в файл вместе с оригиналом. Эта команда дублирует каждую строку и далека от того, что вы хотели.

просто поместите три строки в файл примерно так:

1
2
3

затем запустите sed p file -i. в итоге вы получите:

1
1
2
2
3
3

0

используя 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .