首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Bash中对JSON记录进行分组和排序

在Bash中对JSON记录进行分组和排序
EN

Stack Overflow用户
提问于 2021-05-20 01:01:11
回答 3查看 92关注 0票数 1

我使用curl来获取JSON文件。我的问题是,我想在一行中获得一组4个单词,然后换行,并按第一列排序。

我在试着:

代码语言:javascript
复制
curl -L 'http://mylink/ | jq '.[]| .location, .host_name, .serial_number, .model'

我得到了

代码语言:javascript
复制
"Office-1"    
"work-1"    
"11xxx111"    
"hp"    
"Office-2"    
"work-2"    
"33xxx333"    
"lenovo"    
"Office-1"    
"work-3"    
"22xxx222"    
"dell"

我想要:

代码语言:javascript
复制
"Office-1", "work-1", "11xxx111", "hp"    
"Office-1" "work-3", "22xxx222", "dell"    
"Office-2", "work-2", "33xxx333", "lenovo"

我尝试了jq -S ".[]| .location| group_by(.location),以及其他一些像sort_by(.location)这样的组合,但都不起作用。我收到错误:jq: error (at <stdin>:1): Cannot iterate over string ("Office-1")

我的JSON文件示例:

代码语言:javascript
复制
[
  {
    "location": "Office-1",
    "host_name": "work-1",
    "serial_number": "11xxx111",
    "model": "hp"
  },
  {
    "location": "Office-2",
    "host_name": "work-2",
    "serial_number": "33xxx333",
    "model": "lenovo"
  },
  {
    "location": "Office-1",
    "host_name": "work-3",
    "serial_number": "22xxx222",
    "model": "dell"
  }
]
EN

回答 3

Stack Overflow用户

发布于 2021-05-20 05:05:34

要仅按.location排序,而不使用外部排序:

代码语言:javascript
复制
map( [ .location, .host_name, .serial_number, .model] )
| sort_by(.[0])[]
| map("\"\(.)\"") | join(", ")

", "符合规定的要求。

如果您希望输出为CSV,只需将上面的jq程序中的最后一行替换为@csv

如果目标是最大限度地减少击键次数,那么如果您确定键始终按所需的顺序排列,则可以将第一行替换为map( [ .[] ] )

票数 3
EN

Stack Overflow用户

发布于 2021-05-20 04:17:32

您可以要求jq生成任意格式的字符串。

代码语言:javascript
复制
curl -L 'http://mylink/ |
jq -r '.[]| "\"\(.location)\", \"\(.host_name)\", \"\(.serial_number)\", \"\(.model)\""' |
sort

在双引号内,\"生成文字双引号,\(.field)插入字段名。-r选项是生成非JSON输出所必需的。

票数 1
EN

Stack Overflow用户

发布于 2021-05-20 04:31:59

这将得到您想要的输出:

代码语言:javascript
复制
jq -r 'group_by(.location) | .[] | .[] | map(values) | "\"" + join ("\", \"") + "\""'

如下所示:

代码语言:javascript
复制
$ jq -r 'group_by(.location) | .[] | .[] | map(values) | "\"" + join ("\", \"") + "\""' /tmp/so7713.json
"Office-1", "work-1", "11xxx111", "hp"
"Office-1", "work-3", "22xxx222", "dell"
"Office-2", "work-2", "33xxx333", "lenovo"

如果您希望所有内容都作为一个字符串,那么就简单一点:

代码语言:javascript
复制
$ jq 'group_by(.location) | .[] | .[] | map(values) | join (", ")' /tmp/so7713.json
"Office-1, work-1, 11xxx111, hp"
"Office-1, work-3, 22xxx222, dell"
"Office-2, work-2, 33xxx333, lenovo"

请注意,第二个示例中缺少-r

我觉得一定有更好的方法来做.[] | .[],但我还不知道它是什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67607713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档