awk 输出成 BC HexToDec 计算
awk output into BC HexToDec calculation
我正在尝试组合 awk
和 bc
以创建一个 bash 函数来快速将十六进制值转换为正确的格式。
echo FFFFFF | VAR=$(awk '{print toupper([=10=])}') | "ibase=16; $((((($VAR - 5) / 100) - 1000)))" | bc
我正在尝试这个,但我似乎无法将 awk
的输出输入到 bc
参数的输入中。
尝试
echo FFFFFF |
awk '{printf "ibase=16\n(((((%s - 5) / 100) - 1000)))\n",toupper() ;}' |
bc
(这可以联机,确保 |
是行中的最后一个字符)
原剧本
echo FFFFFF | VAR=$(awk '{print toupper([=11=])}')
awk没有输入,VAR
in empty
"ibase=16; $((((($VAR - 5) / 100) - 1000)))"
"ibase=... "
是一个命令,这不是你想要的,它什么都不输出(保存错误)。
更复杂的公式
VAR=$(echo FFFFFF | tr [:lower:] [:upper:])
VAR2=..
VARx=...
bc <<EOF
ibase=16
((($VAR - 5) / $VAR2) - $VARx)
EOF
其中
bc <<EOF
被称为 heredoc 变量将在 运行. 上被替换
虽然你尝试用awk
和bc
来做,但我在这里给你最方便的选择:printf
。这使您可以轻松地在十进制、八进制和十六进制之间进行转换。
[bash] % printf "%d" 0xFFFFFF # hex2dec
16777215
[bash] % printf "%#O" 0xFFFFFF # hex2oct
077777777
[bash] % printf "%d" 077777777 # oct2dec
16777215
[bash] % printf "%d" 077777777 # oct2hex
0xFFFFFF
[bash] % printf "%#x" 16777215 # dec2hex
0xFFFFFF
[bash] % printf "%#O" 16777215 # dec2oct
077777777
额外字符#
要求printf为十六进制数插入前缀0X
,为八进制数插入前缀0
。如果以十六进制形式添加数字,请不要忘记为数字添加前缀 0x
,为八进制数字添加前缀 0
。
当然 bash
可以选择进行算术运算。
man bash
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is 0
; otherwise the return status is 1
. This is exactly equivalent to let "expression"
.
这使您可以直接进行所有计算。例如。你想要 0xFFFFFF
并减去小数 5
并除以 100
(小数)并减去 1000 小数,你有
[bash] % printf "%d" $(( (0xFFFFFF - 5)/100 - 1000 ))
166772
或者你也可以全部使用十六进制::
[bash] % printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
61439
如果您现在想将这样的数字存储在变量中,您只需这样做
[bash] % vardec=$( printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varhex=$( printf "%#x" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varoct=$( printf "%#O" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
但是,十进制是一种特殊情况,您可以去掉 printf
:
[bash] % vardec=$(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
bash
的算术评估系统允许您以任何底数(最多64位)写入任何数字,并将其转换为十进制。在这里,我将 3 进制数 3#1212
转换为数字 50.
[bash] % echo $(( 3#1212 ))
50
如果您想使用 zsh
,您可以转换回任何其他基数:
[zsh] % echo $(( [##2]7 )) # from base 10 to base 2
111
[zsh] % echo $(( [##5]3#1020101100 )) # from base 3 to base 5
1234321
[zsh] % echo $(( [##36]17#415C67A8 )) # from base 17 to base 36
ROFLOL
您没有提供任何样本输入或预期输出,但这是您想要做的吗?
$ echo FFFFFF | awk '{print strtonum("0x"[=10=])}'
16777215
$ echo FFFFFF | awk '{print ((strtonum("0x"[=10=]) - 5) / 100) - 1000}'
166772
以上使用 GNU awk for strtonum()
将非十进制字符串转换为数值,大小写无关紧要:
$ echo ffffff | awk '{print ((strtonum("0x"[=11=]) - 5) / 100) - 1000}'
166772
或者您的“100”等也可能是十六进制的?
$ echo FFFFFF | awk '{print ((strtonum("0x"[=12=]) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61440
请注意,计算结果实际上是一个浮点数,因此在将其打印为整数时四舍五入:
$ echo FFFFFF | awk '{printf "%f\n", ((strtonum("0x"[=13=]) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61439.976562
P.S。我开始为此使用 gawk-only -n
选项,但实际上应该避免使用 strtonum()
,请参阅 https://www.gnu.org/software/gawk/manual/gawk.html#Nondecimal-Data。
我正在尝试组合 awk
和 bc
以创建一个 bash 函数来快速将十六进制值转换为正确的格式。
echo FFFFFF | VAR=$(awk '{print toupper([=10=])}') | "ibase=16; $((((($VAR - 5) / 100) - 1000)))" | bc
我正在尝试这个,但我似乎无法将 awk
的输出输入到 bc
参数的输入中。
尝试
echo FFFFFF |
awk '{printf "ibase=16\n(((((%s - 5) / 100) - 1000)))\n",toupper() ;}' |
bc
(这可以联机,确保 |
是行中的最后一个字符)
原剧本
echo FFFFFF | VAR=$(awk '{print toupper([=11=])}')
awk没有输入,
VAR
in empty"ibase=16; $((((($VAR - 5) / 100) - 1000)))"
"ibase=... "
是一个命令,这不是你想要的,它什么都不输出(保存错误)。
更复杂的公式
VAR=$(echo FFFFFF | tr [:lower:] [:upper:])
VAR2=..
VARx=...
bc <<EOF
ibase=16
((($VAR - 5) / $VAR2) - $VARx)
EOF
其中
bc <<EOF
被称为 heredoc 变量将在 运行. 上被替换
虽然你尝试用awk
和bc
来做,但我在这里给你最方便的选择:printf
。这使您可以轻松地在十进制、八进制和十六进制之间进行转换。
[bash] % printf "%d" 0xFFFFFF # hex2dec
16777215
[bash] % printf "%#O" 0xFFFFFF # hex2oct
077777777
[bash] % printf "%d" 077777777 # oct2dec
16777215
[bash] % printf "%d" 077777777 # oct2hex
0xFFFFFF
[bash] % printf "%#x" 16777215 # dec2hex
0xFFFFFF
[bash] % printf "%#O" 16777215 # dec2oct
077777777
额外字符#
要求printf为十六进制数插入前缀0X
,为八进制数插入前缀0
。如果以十六进制形式添加数字,请不要忘记为数字添加前缀 0x
,为八进制数字添加前缀 0
。
当然 bash
可以选择进行算术运算。
man bash
((expression))
The expression is evaluated according to the rules described below under ARITHMETIC EVALUATION. If the value of the expression is non-zero, the return status is0
; otherwise the return status is1
. This is exactly equivalent tolet "expression"
.
这使您可以直接进行所有计算。例如。你想要 0xFFFFFF
并减去小数 5
并除以 100
(小数)并减去 1000 小数,你有
[bash] % printf "%d" $(( (0xFFFFFF - 5)/100 - 1000 ))
166772
或者你也可以全部使用十六进制::
[bash] % printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
61439
如果您现在想将这样的数字存储在变量中,您只需这样做
[bash] % vardec=$( printf "%d" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varhex=$( printf "%#x" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
[bash] % varoct=$( printf "%#O" $(( (0xFFFFFF - 0x5)/0x100 - 0x1000 )) )
但是,十进制是一种特殊情况,您可以去掉 printf
:
[bash] % vardec=$(( (0xFFFFFF - 0x5)/0x100 - 0x1000 ))
bash
的算术评估系统允许您以任何底数(最多64位)写入任何数字,并将其转换为十进制。在这里,我将 3 进制数 3#1212
转换为数字 50.
[bash] % echo $(( 3#1212 ))
50
如果您想使用 zsh
,您可以转换回任何其他基数:
[zsh] % echo $(( [##2]7 )) # from base 10 to base 2
111
[zsh] % echo $(( [##5]3#1020101100 )) # from base 3 to base 5
1234321
[zsh] % echo $(( [##36]17#415C67A8 )) # from base 17 to base 36
ROFLOL
您没有提供任何样本输入或预期输出,但这是您想要做的吗?
$ echo FFFFFF | awk '{print strtonum("0x"[=10=])}'
16777215
$ echo FFFFFF | awk '{print ((strtonum("0x"[=10=]) - 5) / 100) - 1000}'
166772
以上使用 GNU awk for strtonum()
将非十进制字符串转换为数值,大小写无关紧要:
$ echo ffffff | awk '{print ((strtonum("0x"[=11=]) - 5) / 100) - 1000}'
166772
或者您的“100”等也可能是十六进制的?
$ echo FFFFFF | awk '{print ((strtonum("0x"[=12=]) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61440
请注意,计算结果实际上是一个浮点数,因此在将其打印为整数时四舍五入:
$ echo FFFFFF | awk '{printf "%f\n", ((strtonum("0x"[=13=]) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61439.976562
P.S。我开始为此使用 gawk-only -n
选项,但实际上应该避免使用 strtonum()
,请参阅 https://www.gnu.org/software/gawk/manual/gawk.html#Nondecimal-Data。