如何用 JQ 填充数字?

Posted

技术标签:

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

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

问题:

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

【问题讨论】:

【参考方案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)\(.)"
    tostring7 转换为 "7" 如果数字有 3 位或更多位,则将填充设置为 "",否则设置为 "0" * (3 - length)(当一个字符串乘以一个数字时,它会重复很多次,例如"foo" * 3 -> "foofoofoo" 并将数字附加到末尾

【讨论】:

以上是关于如何用 JQ 填充数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 0(零)填充整数? [复制]

如何用越来越多的数字填充二维数组?

如何用前导零填充数组?

如何用 if 条件填充列

如何用绑定集合的索引填充组合框?

如何用存储过程填充表中的所有空值