如何使用 jq 将数字转换为字符串?

111

考虑以下 jq 命令和 Json 内容:

jq '.[]|[.string,.number]|join(": ")' <<< '
[
  {
    "number": 3,
    "string": "threee"
  },
  {
    "number": 7,
    "string": "seven"
  }
]
'

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

three: 3
seven: 7

很不幸,我的尝试导致以下错误:

jq:错误:字符串和数字不能相加

我该如何将数字转换为字符串以便它们可以连接在一起?

3个回答

111

jq 命令具有 tostring 函数。我通过尝试和错误学会了如何使用它,以下是使用方法:

jq -r '.[] | [ .string, .number|tostring ] | join(": ")' <<< '
[{ "number": 9, "string": "nine"},
 { "number": 4, "string": "four"}]
'
nine: 9
four: 4

7
非常感谢,这些示例非常有帮助。我发现 jq 使用起来很困难,并且文档不够完善,所以这些示例确实有所帮助。 - Uncle Long Hair

69

另一种可能更直观的格式是:

jq '.[] | .string + ": " + (.number|tostring)' <<< ...

需要注意的是在.number|tostring周围需要加上括号。


对于我的使用情况,我必须保留括号以优先处理事务。对于一般的使用情况最好保留它们。 - SebMa
谢谢!在 jq 的可怕文档让我花费数小时无果后,我也发现这对于连接目的很有效!(同意,这比上面的答案更直观。) - spcsLrg

16
对于这样简单的情况,字符串插值的隐式转换为字符串就可以实现:

对于这样简单的情况,字符串插值的隐式转换为字符串就可以实现:

.[] | "\( .string ): \( .number )"

jq‣play上看它的使用效果。


1
@Ярослав Рахматуллин,那不是无用的转义字符。那是 jq 的字符串插值语法。Ruby 有 "#{ 1 + 2 }",Groovy 有 "${ 1 + 2 }",jq 有 "\( 1 + 2 )" - manatwork
顺便提一下,Swift 也有相同的字符串插值语法。 - Walter Tross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接