Преобразование основы Bash из десятичного числа для преобразовывания в шестнадцатеричную систему

Я использовал некоторое время цикл, и читайте вниз в первый заголовок CSI. Затем я смог записать заголовок и подробные записи.

Это - то, что я имею к настоящему времени:

file="data.txt"
STR=CSI
while IFS= read -r line
do
    if [[ ${line} = @(${STR}*) ]] then
    echo $line > file2.txt
    while IFS= read -r line2
    do
      echo $line2 >> file2.txt
    done
    fi
done <"$file"

Steven

29
19.03.2015, 15:19
4 ответа

С bash (или любой другой оболочкой, при условии наличия команды printf (стандартная POSIX-команда, часто встроенная в оболочки):

printf '%x\n' 85

. С помощью zsh также можно сделать:

dec=85
hex=$(([##16]dec))

, что работает для баз от 2 до 36 (с 0-9a-z в качестве цифр нечувствителен к регистру).

С помощью ksh93 можно использовать:

dec=85
base54=$(printf %..54 "$dec")

Что работает для оснований от 2 до 64 (с 0-9a-zA-Z@_ в качестве цифр).

С ksh и zsh также:

$ typeset -i34 x=123; echo "$x"
34#3l

Хотя это ограничивается основаниями до 36 в ksh88, zsh и pdksh и 64 в ksh93.

Обратите внимание, что все они ограничены размером длинных целых чисел в вашей системе (int с некоторыми оболочками). Для чего-либо большего вы можете использовать bc или dc.

$ echo 'obase=16; 9999999999999999999999' | bc
21E19E0C9BAB23FFFFF
$ echo '16o 9999999999999999999999 p' | dc
21E19E0C9BAB23FFFFF

При поддерживаемых базах от 2 до некоторого числа, требуемого POSIX как минимум до 99. Для баз более 16, цифры более 9 представлены в виде разделенных пробелами 0-значных десятичных чисел.

$ echo 'obase=30; 123456' | bc
 04 17 05 06

Или то же самое с dc (bc раньше (и до сих пор существует в некоторых системах) было оберткой вокруг dc):

$ echo 30o123456p | dc
 04 17 05 06
36
27.01.2020, 19:38

Используйте printf:

$ printf "%d %x\n" $((16#55)) $((10#85))
85 55

Для присвоения значения команде use substitution:

$ x=$( printf "%x" 85 ) ; echo $x
55
5
27.01.2020, 19:38

Используйте встроенный Подстановка арифметического расширения присутствует во всех POSIX-совместимых оболочках - что в наши дни в значительной степени универсально.

$ echo $((0xbc))
188

и

$ hex=dead
$ dec=$((0x$hex))
$ echo $dec
57005

ВНИМАНИЕ: В частности, в последнем примере расширение может привести к неожиданным результатам - шестнадцатеричные цифры в переменной 'hex' должны образовывать допустимую шестнадцатеричную константу, в противном случае появляются потенциально неясные сообщения об ошибках. например если бы 'hex' было '0xdead', арифметическое расширение стало бы 0x0xdead, что не интерпретируется как константа. Конечно, в этом случае арифметическое расширение $ (($ hex)) поможет. Читателю предоставляется в качестве упражнения создать простое сопоставление с шаблоном обработки подстроки, которое удалит необязательный префикс «0x».

2
27.01.2020, 19:38

Вы можете использовать библиотеку awk Velor :

$ velour -n 'print n_baseconv(15, 10, 16)'
F

Или:

$ velour -n 'print n_baseconv(ARGV[1], 10, 16)' 15
F
0
27.01.2020, 19:38

Теги

Похожие вопросы