如何用JQ填充数字?

How to pad numbers with JQ?

我想将 leading/trailing 个零添加到数字字符串中 — 结果字符串需要包含“01”或“001”,而不是“1”。我注意到项目 https://github.com/joelpurra/jq-zeros,但我从包管理器(dnf、fedora)安装了 jq,所以一些 jqnpm 的要求对我来说是不可行的(乍一看),更不用说我对 npm 的恐惧了,因为东西 sudo npm -g 已经毁了我的系统好几次了。

问题:

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

鉴于此 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. 并将数字附加到末尾

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

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

然后用它来用三个 0 填充您的值:

pad_left(3; "0")

基于 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 无关,并且使用起来非常安全,至少如果你不 运行须藤。