【问题标题】:jq - select objects and print null for missingjq - 选择对象并为丢失打印 null
【发布时间】:2021-06-29 01:57:29
【问题描述】:

我正在尝试从 json 文件生成排序的 CSV,文件如下

cat role1.json
{
  "Tags": [
    {
      "Key": "Name",
      "Value": "Role1Name"
    },
    {
      "Key": "ID",
      "Value": "Role1ID"
    },
    {
      "Key": "Manager",
      "Value": "Role1Manager"
    },
    {
      "Key": "User",
      "Value": "Role1User"
    },
    {
      "Key": "Country",
      "Value": "USA"
    }
  ]
}

cat role2.json
{
  "Tags": [
    {
      "Key": "Name",
      "Value": "Role2Name"
    },
    {
      "Key": "ID",
      "Value": "Role2ID"
    },
    {
      "Key": "City",
      "Value": "NewYork"
    },
    {
      "Key": "Creator",
      "Value": "Role2Creator"
    },
    {
      "Key": "User",
      "Value": "Role2User"
    }
  ]
}

cat role3.json
{
  "Tags": [
    {
      "Key": "Name",
      "Value": "Role3Name"
    },
    {
      "Key": "ID",
      "Value": "Role3ID"
    },
    {
      "Key": "Creator",
      "Value": "Role3Creator"
    },
    {
      "Key": "ZIP",
      "Value": 82378
    },
    {
      "Key": "Manager",
      "Value": "Role3Manager"
    },
    {
      "Key": "User",
      "Value": "Role3User"
    }
  ]
}

我想从其中的每一个中生成行以供以后用作 CSV,例如:

Role1Name, Role1ID, null, Role1Manager, Role1User
Role2Name, Role2ID, Role2Creator, null, Role2User
Role3Name, Role3ID, Role3Creator, Role3Manager, Role3User

对于标题行 姓名、ID、创建者、经理、用户

我能够获取所有“值”,但无法为缺少“键”打印 null

$cat role1.json | jq -rc  '[.Tags[] | select(.Key == ("Name","ID","Creator","Manager","User")) | .Value]'
["Role1Name","Role1ID","Role1Manager","Role1User"]

$cat role2.json | jq -rc  '[.Tags[] | select(.Key == ("Name","ID","Creator","Manager","User")) | .Value]'
["Role2Name","Role2ID","Role2Creator","Role2User"]

$cat role3.json | jq -rc  '[.Tags[] | select(.Key == ("Name","ID","Creator","Manager","User")) | .Value]'
["Role3Name","Role3ID","Role3Creator","Role3Manager","Role3User"]

有人可以和我分享一下如何使用 jq 来完成。

另外,我们如何执行命令。

谢谢!

【问题讨论】:

    标签: json csv export-to-csv jq


    【解决方案1】:

    关键(哈!)是

    [ .[ $keys[] ] ]
    

    如果您查看过有关 CSV 问题的其他答案,您可能已经注意到第一步是获取密钥列表。这通常是通过收集输入对象的键来完成的。 (Example) 在你的情况下,你有一个硬编码列表,所以它更简单。


    如果你想要实际的 CSV,你可以使用

    jq -sr '
       [ "Name", "ID", "Creator", "Manager", "User" ] as $keys |
       (
          $keys,
          ( .[].Tags | from_entries | [ .[ $keys[] ] ] )
       ) |
       @csv
    ' role*.json
    

    这会产生

    "Name","ID","Creator","Manager","User"
    "Role1Name","Role1ID",,"Role1Manager","Role1User"
    "Role2Name","Role2ID","Role2Creator",,"Role2User"
    "Role3Name","Role3ID","Role3Creator","Role3Manager","Role3User"
    

    jqplay

    没有标题:

    jq -r '.Tags | from_entries | [ .["Name","ID","Creator","Manager","User"] ] | @csv' role*.json
    

    jqplay


    要获取您发布的特定输出(不是 CSV),您可以使用

    jq -sr '
       [ "Name", "ID", "Creator", "Manager", "User" ] as $keys |
       (
          $keys,
          ( .[].Tags | from_entries | [ .[ $keys[] ] | . // "null" ] )
       ) |
       join(", ")
    ' role*.json
    

    这会产生

    Name, ID, Creator, Manager, User
    Role1Name, Role1ID, null, Role1Manager, Role1User
    Role2Name, Role2ID, Role2Creator, null, Role2User
    Role3Name, Role3ID, Role3Creator, Role3Manager, Role3User
    

    jqplay

    没有标题:

    jq -r '.Tags | from_entries | [ .["Name","ID","Creator","Manager","User"] | . // "null" ] | join(", ")' role*.json
    

    jqplay

    【解决方案2】:

    从另一个论坛得到答案,可能对其他人有用

    $jq -rc  '.Tags | from_entries | [.Name, .ID, .Creator, .Manager, .User]' role*.json
    ["Role1Name","Role1ID",null,"Role1Manager","Role1User"]
    ["Role2Name","Role2ID","Role2Creator",null,"Role2User"]
    ["Role3Name","Role3ID","Role3Creator","Role3Manager","Role3User"]
    

    【讨论】:

    • 不过,这既不是 CSV,也不是 OP 中要求的格式。问题或答案是否有错误?
    • 谢谢stackoverflow.com/users/589924/ikegami。您的回答很有帮助,我只是想发布其他回复。我同意它不一样,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    相关资源
    最近更新 更多