如何使用 jq 在 linux 中输出十进制低位

Posted

技术标签:

【中文标题】如何使用 jq 在 linux 中输出十进制低位【英文标题】:How do I use jq to output a decimal low in linux 【发布时间】:2018-12-24 15:11:14 【问题描述】:

给定以下 jq 命令和 Json:(仅 jq 命令)

echo '"foo": "bar": 0.00000072' | jq 'map_values( . + "bar": .bar|tostring )'

  "foo": 
    "bar": "7.2e-07"
  

我正在尝试将输出格式化为:


  "foo": 
    "bar": "0.00000072"
  


  "foo": 
    "bar": 0.00000072
  

【问题讨论】:

在我看来,这不是链接到问题 ***.com/questions/42956806/… 的重复,因为这里的数字 JSON 字符串被认为是可以接受的,而另一个问题要困难得多(即,实际上,不可能)单独使用 jq 来解决。 嗯。我可以看到一个丑陋的 hack 单独使用 jq 在你在这里得到的东西之上建立另一个答案(使用 tojson 和一个独特的印记作为字符串搜索/替换标记生成恰好是有效 JSON 的原始输出),但它确实涉及更多。 不确定你的意思......你必须写一个新的漂亮的打印机,这是相当多的工作。用户控制格式的需求非常大,我希望它会尽快发生,而不是很晚,所以现在我倾向于等待...... 感谢大家的回复。因为确定只有“jq”是不可能的,所以我认识到在这个问题中,“***.com/questions/42956806/…”是最干净的选择,也是适合我需要的选择。 【参考方案1】:

你可以使用这个通用函数:

def to_decimal:
  def rpad(n): if (n > length) then . + ((n - length) * "0") else . end;
  def lpad(n): if (n > length) then ((n - length) * "0") + . else . end;
  tostring
  | . as $s
  | capture( "(?<sgn>[+-]?)(?<left>[0-9]*)(?<p>\\.?)(?<right>[0-9]*)(?<e>[Ee]?)(?<exp>[+-]?[0-9]+)" )
  | if .e == "" then $s
    else (.left|length) as $len
    | (.exp | tonumber) as $exp
    | if $exp < 0 then .sgn + "0." + (.left | lpad(1 - $exp - $len)) + .right
      else .sgn + (.left | rpad($exp - $len)) + "." + .right
      end
    end ;

例子:

"7.2e-07"|to_decimal

产量:

"0.00000072"

【讨论】:

这将是对这个问题的预先存在/规范实例的一个非常好的答案(***.com/questions/42956806/…,现在链接到标记当前实例重复)。 @CharlesDuffy - 哇!我没有意识到我有神奇的力量(重新打开)。 希望你现在成为jq的金牌;我从你的回答中学到了我所知道的大部分语言。 @CharlesDuffy - 我可能会因为在这里聊天而失去它,但让我说来自你,这是一个真正的赞美!我会把它算作白金徽章:-)

以上是关于如何使用 jq 在 linux 中输出十进制低位的主要内容,如果未能解决你的问题,请参考以下文章

c语言中怎么将十六进制中的高位和低位分别存到数组中

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

c语言:输入一个数,从高位向低位输出,如:输入12345,输出1 2 3 4 5

如何使用 jq 从 JSON 中获取键名

十进制转成二进制