一尘不染

如何使用jq将JSON字符串格式化为表?

json

刚开始使用Bash脚本编写时,偶然发现jq可与JSON一起使用。

我需要将如下所示的JSON字符串转换为表格以在终端中输出。

[{
    "name": "George",
    "id": 12,
    "email": "george@domain.com"
}, {
    "name": "Jack",
    "id": 18,
    "email": "jack@domain.com"
}, {
    "name": "Joe",
    "id": 19,
    "email": "joe@domain.com"
}]

我要在终端中显示的内容:

ID        Name
=================
12        George
18        Jack
19        Joe

请注意,我不想显示每一行的email属性,因此jq命令应该涉及一些过滤。下面为我​​提供了一个简单的名称和ID列表:

list=$(echo "$data" | jq -r '.[] | .name, .id')
printf "$list"

问题是,我无法将其显示为表格。我知道jq有一些格式化选项,但不如我使用时的选项好printf。我想我想在一个数组中获取这些值,然后可以遍历自己进行格式化…?我尝试过的事情给我带来了不同的结果,但从来没有我真正想要的。

有人可以指出我正确的方向吗?


阅读 206

收藏
2020-07-27

共1个答案

一尘不染

为什么不这样:

echo '[{
    "name": "George",
    "id": 12,
    "email": "george@domain.com"
}, {
    "name": "Jack",
    "id": 18,
    "email": "jack@domain.com"
}, {
    "name": "Joe",
    "id": 19,
    "email": "joe@domain.com"
}]' | jq -r '.[] | "\(.id)\t\(.name)"'

输出量

12  George
18  Jack
19  Joe

编辑1: 对于细粒度的格式化,请使用以下工具awk

 echo '[{
    "name": "George",
    "id": 12,
    "email": "george@domain.com"
}, {
    "name": "Jack",
    "id": 18,
    "email": "jack@domain.com"
}, {
    "name": "Joe",
    "id": 19,
    "email": "joe@domain.com"
}]' | jq -r '.[] | [.id, .name] | @csv' | awk -v FS="," 'BEGIN{print "ID\tName";print "============"}{printf "%s\t%s%s",$1,$2,ORS}'
ID  Name
============
12  "George"
18  "Jack"
19  "Joe"

编辑2: 回复

无法从jq直接获取包含数组的变量吗?

为什么不?

涉及到一个示例(实际上是从您的示例修改而来的),其中将电子邮件更改为数组说明了这一点

echo '[{
    "name": "George",
    "id": 20,
    "email": [ "george@domain1.com" , "george@domain2.com" ]
}, {
    "name": "Jack",
    "id": 18,
    "email": [ "jack@domain3.com" , "jack@domain5.com" ]
}, {
    "name": "Joe",
    "id": 19,
    "email": [ "joe@domain.com" ]
}]' | jq -r '.[] | .email'

输出量

[
  "george@domain1.com",
  "george@domain2.com"
]
[
  "jack@domain3.com",
  "jack@domain5.com"
]
[
  "joe@domain.com"
]
2020-07-27