URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8615
[ Назад ]

Исходное сообщение
"Преобразование hex  в  dec"

Отправлено rec , 10-Фев-10 11:02 
Добрый день! Не могли бы подсказать как проще преобразовать колонку шестнадцатиричных цифр в десятичные. Имеем file следующего содержания:
с8
00
4e
ba
be
11
21
и т.д.

Хотелось бы организовать цикл примерно следующего вида:

#!/bin/sh
while read line
do
`echo ibase=16; $line | bc`
done < file > file1

Как правильно заставить работать калькулятор в цикле и можно ли?


Содержание

Сообщения в этом обсуждении
"Преобразование hex  в  dec"
Отправлено rec , 10-Фев-10 11:05 
FreeBSD старенькая...


"Преобразование hex  в  dec"
Отправлено Andrey Mitrofanov , 10-Фев-10 13:01 
>[оверквотинг удален]
>
>Хотелось бы организовать цикл примерно следующего вида:
>
>#!/bin/sh
>while read line
>do
> `echo ibase=16; $line | bc`
>done < file > file1
>
>Как правильно заставить работать калькулятор в цикле и можно ли?

$ seq 10 20|bc <(echo 'obase=16; while((val=read())!=0){val}')
A
B
C
D
E
F
10
11
12
13
14
^C
$ _

Как-то bc "не понимает" конца файла. Может, у меня bc неправильный--

У awk-а с этим проще -
$ seq 10 20|awk '{printf "%x\n",$1}'
$ seq 10 20|awk '{printf "%X\n",$1}'

printf и  в bash-е есть:
$ seq 10 20|while read nn; do printf "%X\n" $nn; done

Ну, извращаться, так извращаться!

$ ( echo 0;seq 10 20; ) |awk '{print 1;print}END{print 0}'|bc <(echo 'obase=16; while(read()!=0){read();}')
0
A
B
C
D
E
F
10
11
12
13
14
$ _

Ой, там же ibase... Ну, да ладно++


"Преобразование hex  в  dec"
Отправлено rec , 10-Фев-10 14:29 
>$ ( echo 0;seq 10 20; ) |awk '{print 1;print}END{print 0}'|bc <(echo
>'obase=16; while(read()!=0){read();}')

в моей FreeBSD, к сожалению, нет утилиты seq
Сам я из разряда скажем так чайников, поэтому задам может быть глупый вопрос: а как связывается имеющийся файл file с данными, которые необходимо преобразовать в десятичный вид, с вашим предложенным решением?


"Преобразование hex  в  dec"
Отправлено Andrey Mitrofanov , 10-Фев-10 14:46 
>>$ ( echo 0;seq 10 20; ) |

Это у меня "генератор" исходных данных - числа 0 и от 10 до 20-ти, посторочно.

>>awk '{print 1;print}END{print 0}'|bc <(echo
>>'obase=16; while(read()!=0){read();}')
>Сам я из разряда скажем так чайников, поэтому задам может быть глупый
>вопрос: а как связывается имеющийся файл file с данными, которые необходимо
>преобразовать в десятичный вид, с вашим предложенным решением?

Ну, если гениальность %) решения совсем не интересует, то:
1. заменить генератор на "cat file |", без кавычек
2. заменить obase на ibase (у меня в примере dec->hex)
3. пройти в кассу для оплаты


"Преобразование hex  в  dec"
Отправлено rec , 10-Фев-10 16:18 
>Ну, если гениальность %) решения совсем не интересует, то:
>1. заменить генератор на "cat file |", без кавычек
>2. заменить obase на ibase (у меня в примере dec->hex)
>3. пройти в кассу для оплаты

Очевидно чайнику сложно определить степень гениальности того или иного решения. Но по мере появления определенного опыта я думаю эта проблема исчезнет. В конце концов ведь все гениальное просто.
Сделал все как вы рекомендовали, появляется: Syntax error: "(" unexpected.

Отсутствие результата заставило меня вернуться к

#!/bin/sh
while read line
do
`echo ibase=16; $line | bc`
done < file > file1

Простая в общем-то штука, которая должна работать. После приведения ее к виду

#!/bin/sh
while read line
do
echo "ibase=16; $line" | bc
done < file > file1

она заработала. Спасибо.


"Преобразование hex  в  dec"
Отправлено Andrey Mitrofanov , 10-Фев-10 16:40 
>#!/bin/sh
>while read line

А, ну, да, та же скрипт был...

>она заработала. Спасибо.

Пожалуйста.

#!/bin/bash
cat file |\
  awk '{print 1;print}END{print 0}' |\
  bc <(echo 'obase=16; while(read()!=0){read();}') \
>file1

Конструкция "<( ... )", похоже, - башизм, потому и первая строка такая, потому и "Syntax error" в "просто" sh.


"Преобразование hex  в  dec"
Отправлено phpcoder , 10-Фев-10 15:32 
>в моей FreeBSD, к сожалению, нет утилиты seq

AFAIR в *BSD вместо seq можно использовать jot.



"Преобразование hex  в  dec"
Отправлено rec , 11-Фев-10 14:16 
Не могли бы подсказать еще ( не буду открывать новой темы) как примерно, чем воспользоваться в #!/bin/sh, чтобы последовательность вида

а
00
4
b
а
e
а
11
21
1
11

и т.д. привести к виду

а 00 4 b
а e
а 11 21 1 11

и т.д.
Т.е. обязательным условием является то, что в последовательности "а" является началом очередной строки , количество слов, разделенных каким-нибудь знаком (запятой, пробелом), в строке различное.


"Преобразование hex  в  dec"
Отправлено Andrey Mitrofanov , 11-Фев-10 16:22 
|tr \\n \ |sed 's/ a /\
a /g'

Может, и до одного вызова sed-а можно "ужать", но лениво и не факт, что проще-короче будет.
Один "а" в строке -- не обрабатывается ...тоже. От этого "помогает" двойная замена... Вторая версия:

|tr \\n \ |sed 's/ a /\
a /g;s/ a /\
a /g'

О, работает. %) Проверено электроникой =seq 11 19|od -t x1|sed 's/ 3[1289]/ a/g'


"Преобразование hex  в  dec"
Отправлено rec , 12-Фев-10 11:42 
>|tr \\n \ |sed 's/ a /\
>a /g;s/ a /\
>a /g'
>
>О, работает.

Спасибо за помощь. :)
А чем объяснить, что, если записать ваше выражение в одну строку, оно перестает работать?
Именно в три строки - работает.


"Преобразование hex  в  dec"
Отправлено Andrey Mitrofanov , 12-Фев-10 12:40 
Сочетание "\" + новая строка -- значащее. Это, таки да, новая строка, которая вставяется в результат. ~~Эта команда (=одна "командная строка") состоит из трёх строк (~текста).