awk输出到BC HexToDec计算

时间:2018-02-12 14:05:58

标签: bash awk bc

我正在尝试合并def trigger(context, dag_run_obj): dag_run_obj.payload = { "message": context["dag_run"].conf["message"], "day": context["dag_run"].conf["day"] } return dag_run_obj trigger_step = TriggerDagRunOperator( task_id="trigger_modelling", trigger_dag_id="Dummy_Modelling", python_callable=trigger, dag=dag ) awk,以便创建一个bash函数,以便将十六进制值快速转换为正确的格式。

bc

我正在尝试这个但是我似乎无法将echo FFFFFF | VAR=$(awk '{print toupper($0)}') | "ibase=16; $((((($VAR - 5) / 100) - 1000)))" | bc 的输出输入到awk参数的输入中。

3 个答案:

答案 0 :(得分:3)

 echo FFFFFF |
 awk '{printf "ibase=16\n(((((%s - 5) / 100) - 1000)))\n",toupper($1) ;}' |
 bc

(可以上线,确保|是最后一个字符串)

原始剧本

echo FFFFFF | VAR=$(awk '{print toupper($0)}') 
  • awk没有输入,VAR为空

    "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变量将在运行时被调整。

答案 1 :(得分:3)

虽然您尝试使用awkbc,但我在这里为您提供了最方便的选项: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添加为八进制数。

Ofcourse bash可以选择进行算术运算。

  

<强> man bash ((expression))    根据ARITHMETIC EVALUATION下面描述的规则评估表达式。如果表达式的值不为零,则返回状态为0;否则返回状态为1。这完全等同于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

答案 2 :(得分:3)

您没有提供任何样本输入或预期输出,但这是您尝试做的吗?

$ echo FFFFFF | awk '{print strtonum("0x"$0)}'
16777215

$  echo FFFFFF | awk '{print ((strtonum("0x"$0) - 5) / 100) - 1000}'
166772

以上使用strtonum()的GNU awk将非十进制字符串转换为数字值并且大小写无关紧要:

$  echo ffffff | awk '{print ((strtonum("0x"$0) - 5) / 100) - 1000}'
166772

或者你的&#34; 100&#34;等也是十六进制的?

$ echo FFFFFF | awk '{print ((strtonum("0x"$0) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61440

请注意,计算结果实际上是一个浮点数,因此在将其作为整数打印时应用上述:

$ echo FFFFFF | awk '{printf "%f\n", ((strtonum("0x"$0) - strtonum("0x5")) / strtonum("0x100")) - strtonum("0x1000")}'
61439.976562

P.S。我开始使用仅限gawk的-n选项,但实际上应该避免使用strtonum(),请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Nondecimal-Data