Добрый день! Не могли бы подсказать как проще преобразовать колонку шестнадцатиричных цифр в десятичные. Имеем file следующего содержания:
с8
00
4e
ba
be
11
21
и т.д.Хотелось бы организовать цикл примерно следующего вида:
#!/bin/sh
while read line
do
`echo ibase=16; $line | bc`
done < file > file1Как правильно заставить работать калькулятор в цикле и можно ли?
FreeBSD старенькая...
>[оверквотинг удален]
>
>Хотелось бы организовать цикл примерно следующего вида:
>
>#!/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... Ну, да ладно++
>$ ( echo 0;seq 10 20; ) |awk '{print 1;print}END{print 0}'|bc <(echo
>'obase=16; while(read()!=0){read();}')в моей FreeBSD, к сожалению, нет утилиты seq
Сам я из разряда скажем так чайников, поэтому задам может быть глупый вопрос: а как связывается имеющийся файл file с данными, которые необходимо преобразовать в десятичный вид, с вашим предложенным решением?
>>$ ( 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. пройти в кассу для оплаты
>Ну, если гениальность %) решения совсем не интересует, то:
>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она заработала. Спасибо.
>#!/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.
>в моей FreeBSD, к сожалению, нет утилиты seqAFAIR в *BSD вместо seq можно использовать jot.
Не могли бы подсказать еще ( не буду открывать новой темы) как примерно, чем воспользоваться в #!/bin/sh, чтобы последовательность видаа
00
4
b
а
e
а
11
21
1
11и т.д. привести к виду
а 00 4 b
а e
а 11 21 1 11и т.д.
Т.е. обязательным условием является то, что в последовательности "а" является началом очередной строки , количество слов, разделенных каким-нибудь знаком (запятой, пробелом), в строке различное.
|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'
>|tr \\n \ |sed 's/ a /\
>a /g;s/ a /\
>a /g'
>
>О, работает.Спасибо за помощь. :)
А чем объяснить, что, если записать ваше выражение в одну строку, оно перестает работать?
Именно в три строки - работает.
Сочетание "\" + новая строка -- значащее. Это, таки да, новая строка, которая вставяется в результат. ~~Эта команда (=одна "командная строка") состоит из трёх строк (~текста).