简体   繁体   English

使用JQ解析JSON对象数组,使用select匹配object元素中的指定键值,然后转换为object元素,然后转换为select

[英]Use JQ to parse JSON array of objects, using select to match specified key-value in the object element, then convert to CSV

Use JQ to parse JSON array of objects, using select to match specified key-value in the object element, then convert to CSV.使用 JQ 解析 JSON 对象数组,使用 select 匹配 object 元素中的指定键值,然后转换为 object 元素,然后转换为 select 元素,然后转换为 object 元素

Data Source:数据源:

{
  "Other": [],
  "Objects": [
    {
      "ObjectElementName": "Test 123",
      "ObjectElementArray": [],
      "ObjectElementUnit": "1"
    },
    {
      "ObjectElementName": "Test ABC 1",
      "ObjectElementArray": [],
      "ObjectElementUnit": "2"
    },
    {
      "ObjectElementName": "Test ABC 2",
      "ObjectElementArray": [],
      "ObjectElementUnit": "5"
    }
  ],
  "Language": "en-US"
}

JQ command to extract JQ命令解压

jq -r '.Objects[] | select(.ObjectElementName | contains("ABC"))'

Output given (individual objects only, no JSON structure)... Output 给定(仅单个对象,无 JSON 结构)...

{
  "ObjectElementName": "Test ABC 1",
  "ObjectElementArray": [],
  "ObjectElementUnit": "2"
}
{
  "ObjectElementName": "Test ABC 2",
  "ObjectElementArray": [],
  "ObjectElementUnit": "5"
}

Output needed in this format (preserving the JSON array above the objects) Output 需要这种格式(在对象上方保留 JSON 数组)

{
  "Other": [],
  "Objects": [
    {
      "ObjectElementName": "Test ABC 1",
      "ObjectElementArray": [],
      "ObjectElementUnit": "2"
    },
    {
      "ObjectElementName": "Test ABC 2",
      "ObjectElementArray": [],
      "ObjectElementUnit": "5"
    }
  ],
  "Language": "en-US"
}

Output needed in this format, so CSV conversion can be executed Output需要这种格式,所以可以执行CSV转换

in2csv -f json --key Objects > output.csv

Output CSV required需要 Output CSV

ObjectElementName,ObjectElementUnit
Test ABC 1,2
Test ABC 2,5

If you want CSV, you should probably use jq's @csv filter, which essentially guarantees valid CSV output.如果你想要 CSV,你可能应该使用 jq 的@csv过滤器,它基本上保证了有效的 CSV output。 For example, using your input:例如,使用您的输入:

jq -r '
  ["ObjectElementName","ObjectElementUnit"],
  (.Objects[]
   | select(.ObjectElementName | test("ABC"))
   | [.ObjectElementName,.ObjectElementUnit] )
  | @csv' input.json

produces:产生:

"ObjectElementName","ObjectElementUnit"
"Test ABC 1","2"
"Test ABC 2","5"

However, if you're willing to take the risks, you could replace @csv by join(",") , which in the present case would result in:但是,如果您愿意冒险,可以将@csv替换为join(",") ,在本例中会导致:

ObjectElementName,ObjectElementUnit
Test ABC 1,2
Test ABC 2,5

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM