The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Преобразование hex  в  dec"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Преобразование hex  в  dec"  +/
Сообщение от rec (ok) on 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

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

Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Преобразование hex  в  dec"  +/
Сообщение от rec (ok) on 10-Фев-10, 11:05 
FreeBSD старенькая...

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Преобразование hex  в  dec"  +/
Сообщение от Andrey Mitrofanov on 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... Ну, да ладно++

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Преобразование hex  в  dec"  +/
Сообщение от rec (ok) on 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 с данными, которые необходимо преобразовать в десятичный вид, с вашим предложенным решением?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Преобразование hex  в  dec"  +/
Сообщение от Andrey Mitrofanov on 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. пройти в кассу для оплаты

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Преобразование hex  в  dec"  +/
Сообщение от rec (ok) on 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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Преобразование hex  в  dec"  +/
Сообщение от Andrey Mitrofanov on 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.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Преобразование hex  в  dec"  +/
Сообщение от phpcoder email(??) on 10-Фев-10, 15:32 
>в моей FreeBSD, к сожалению, нет утилиты seq

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


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

а
00
4
b
а
e
а
11
21
1
11

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

а 00 4 b
а e
а 11 21 1 11

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Преобразование hex  в  dec"  +/
Сообщение от Andrey Mitrofanov on 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'

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

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

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру