【问题标题】:How to pad numbers with JQ?如何用 JQ 填充数字?
【发布时间】:2021-03-05 13:15:16
【问题描述】:

我想在数字字符串中添加前导/尾随零 - 结果字符串需要包含“01”或“001”而不是“1”。我注意到项目https://github.com/joelpurra/jq-zeros,但我已经从包管理器(dnf,fedora)安装了jq,所以一些jqnpm的要求对我来说是不可行的(乍一看),更不用说我对npm的恐惧,就像sudo npm -g一样已经多次破坏了我的系统。

问题:

  1. 这些 jq 包管理器,它们是否正在被主流接受?
  2. 填充本身 - 如果没有这个额外的库怎么办?

【问题讨论】:

    标签: json jq zero-padding


    【解决方案1】:

    您可以在过滤器的开头定义这些函数,或将其添加到您的 ~/.jq 文件中,然后使用它来填充数字。

    def pad_left($len; $chr):
        (tostring | length) as $l
        | "\($chr * ([$len - $l, 0] | max) // "")\(.)"
        ;
    def pad_left($len):
        pad_left($len; " ")
        ;
    

    然后用它用三个0s 填充你的值:

    pad_left(3; "0")
    

    【讨论】:

      【解决方案2】:

      基于来自In jq, how to get tonumber to output decimal instead of scientific notation 的 jq-esque 定义:

      def lpad(n):
        tostring
        | if (n > length) then ((n - length) * "0") + . else . end;
      

      至于 jq 模块管理器,jq 的官方开发管道中没有任何内容,但 jqnpm 与 npm 无关,并且使用起来相当安全,至少如果你不使用 sudo 运行它。

      【讨论】:

        【解决方案3】:

        鉴于此 JSON 文档:

        7
        

        您可以使用以下过滤器实现"007":(或"042" 使用42

        tostring | (length | if . >= 3 then "" else "0" * (3 - .) end) as $padding | "\($padding)\(.)"
        
        1. tostring7 转换为 "7"
        2. 如果数字有 3 位或更多位,则将填充设置为 "",否则设置为 "0" * (3 - length)(当一个字符串乘以一个数字时,它会重复很多次,例如"foo" * 3 -> "foofoofoo"
        3. 并将数字附加到末尾

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          相关资源
          最近更新 更多