【问题标题】:jq: error (at report.json:32): Cannot index string with string "complianceId"jq:错误(在 report.json:32):无法使用字符串“complianceId”索引字符串
【发布时间】:2021-03-15 12:49:57
【问题描述】:

我正在尝试通过 jq 解析 json 文件中的 CSV 输出。

Json 看起来像这样:

{
    "report": {
        "id": "xxx-xxxxx-xxxx",
        "machineId": "xxx-xxxxx-xxxx",
        "scanDate": "2020-12-03T09:11:28Z",
        "moduleReports": {
            "COMPLIANCE": {
                "complianceCheckVersion": "1.3.1",
                "items": [
                    {
                        "complianceId": "Report_ID1",
                        "title": "Title of Report ID1",
                        "status": "FULFILLED",
                        "requirementSourceType": "ABC"
                    },
                    {
                        "complianceId": "Report_ID2",
                        "title": "Title of Report ID2",
                        "status": "FULFILLED",
                        "requirementSourceType": "ABC"
                    },
                    {
                        "complianceId": "Report_ID3",
                        "title": "Title of Report ID3",
                        "status": "FULFILLED",
                        "requirementSourceType": "DEF"
                    }
                ]
            }
        }
    }
}

我想解析,所以只有 key requirementSourceTypevalue 的结果只有 ABCDEF 应该被过滤掉。

过滤没有问题,目前是用这个命令完成的:

jq -r '.report | .moduleReports | .COMPLIANCE | .items[] | select(.requirementSourceType=="CIS")' report.json

但是,当我尝试为 CSV 报告创建唯一列时,使用以下命令输出:

jq -r '.report | .moduleReports | .COMPLIANCE | .items[] | select(.requirementSourceType=="CIS") | map({complianceId, title, status}) | (map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' report.json

...我收到此错误:

jq:错误(在 report.json:32):无法使用字符串“complianceId”索引字符串

请问有什么办法可以解决这个错误吗?

我试图研究这样的解决方案,但找不到类似的案例。

谢谢。

编辑

预期的 CSV 输出:

"complianceId","status","title"
"Report_ID1","FULFILLED","Title of Report ID1"
"Report_ID2","FULFILLED","Title of Report ID2"
"Report_ID3","FULFILLED","Title of Report ID3"

【问题讨论】:

  • 你期望什么输出?
  • 帖子更新为预期输出。

标签: json linux shell csv jq


【解决方案1】:

我不确定您期望什么输出。这对你有用吗?

jq -r '[
    .report.moduleReports.COMPLIANCE.items[]
    | select(.requirementSourceType=="CIS")
    | [.complianceId, .title, .status]
] | unique | .[] | @csv' report.json

【讨论】:

  • 帖子已更新。这行得通,除了我错过了列规范的顶行。就像"complianceId","status","title" 在第一行并在下一行休息。谢谢。
  • 想通了。这是正确的格式:jq -r '[ .report.moduleReports.COMPLIANCE.items[] | select(.requirementSourceType=="CIS") | ["ComplianceID","Status","Title"], [.complianceId, .status, .title] ] | unique | .[] | @csv' report.json。非常感谢!
  • @BlažejFarkaš - 您不想在提供给unique 的数组中包含标题行,这涉及排序。您可以简单地使用模板:HEADERARRAY, (....) | @csv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多