【问题标题】:Is it possible to use jq to sort_by then sort_by again by sub item是否可以使用 jq 来 sort_by 然后 sort_by 再次按子项目
【发布时间】:2018-08-10 14:42:57
【问题描述】:

我有以下 json:

[
  {
    "SG": [
      {
        "Id": "17",
        "GroupName": "fistGN",
        "Permissions": [
          {
            "Port": 80,
            "Protocol": "tcp"
          },
          {
            "Port": 8080,
            "Protocol": "tcp"
          },
          {
            "Port": 5080,
            "Protocol": "tcp"
          }
        ]
      },
      {
        "Id": "1",
        "GroupName": "secondGN",
        "Permissions": [
          {
            "Port": 80,
            "Protocol": "tcp"
          },
          {
            "Port": 8080,
            "Protocol": "tcp"
          },
          {
            "Port": 5080,
            "Protocol": "tcp"
          }
        ]
      }
    ]
  }
]

是否可以使用单个命令按 GroupName 排序,然后按权限端口对每个组进行排序?

这是我正在尝试做的,但没有按预期工作:

jq -s -S '.[].SG |= sort_by(.GroupName, .Permissions[].Port)' myfile.json

【问题讨论】:

    标签: json sorting jq


    【解决方案1】:

    jq解决方案:

    jq '.[0].SG |= (map(.Permissions |= sort_by(.Port)) | sort_by(.GroupName))' myfile.json
    
    • (map(.Permissions |= sort_by(.Port)) | sort_by(.GroupName)) - 用于分隔 2 个排序操作的复合表达式:
      • map(.Permissions |= sort_by(.Port)) - 获取一个新数组,其中每个内部 .Permissions 数组按键 "Port" 值排序
      • sort_by(.GroupName) - 按 "GroupName" 键对 SG 数组项进行排序

    输出:

    [
      {
        "SG": [
          {
            "Id": "17",
            "GroupName": "fistGN",
            "Permissions": [
              {
                "Port": 80,
                "Protocol": "tcp"
              },
              {
                "Port": 5080,
                "Protocol": "tcp"
              },
              {
                "Port": 8080,
                "Protocol": "tcp"
              }
            ]
          },
          {
            "Id": "1",
            "GroupName": "secondGN",
            "Permissions": [
              {
                "Port": 80,
                "Protocol": "tcp"
              },
              {
                "Port": 5080,
                "Protocol": "tcp"
              },
              {
                "Port": 8080,
                "Protocol": "tcp"
              }
            ]
          }
        ]
      }
    ]
    

    【讨论】:

    • 太棒了。你介意教育我解决方案的每一步吗?恐怕我不明白为什么需要这张地图。
    • @douglaslps,是的,看我的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2021-04-25
    相关资源
    最近更新 更多