首页 > 解决方案 > 在 Bash 中对 JSON 记录进行分组和排序

问题描述

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

我正在努力:

curl -L 'http://mylink/ | jq '.[]| .location, .host_name, .serial_number, .model'

我越来越

"Office-1"    
"work-1"    
"11xxx111"    
"hp"    
"Office-2"    
"work-2"    
"33xxx333"    
"lenovo"    
"Office-1"    
"work-3"    
"22xxx222"    
"dell"

我想拥有:

"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 文件示例:

[
  {
    "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"
  }
]

标签: jsonsortinggroup-byjq

解决方案


仅排序.location,没有外部排序:

map( [ .location, .host_name, .serial_number, .model] )
| sort_by(.[0])[]
| map("\"\(.)\"") | join(", ")

", "是按照规定的要求。

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

如果最小化击键是一个目标,那么如果您确定键始终处于所需的顺序,您可以将第一行替换为map( [ .[] ] )


推荐阅读