刚开始使用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。我想我想在一个数组中获取这些值,然后可以遍历自己进行格式化…?我尝试过的事情给我带来了不同的结果,但从来没有我真正想要的。
printf
有人可以指出我正确的方向吗?
为什么不这样:
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
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" ]