linux 如何使用jq将嵌套JSON转换为csv

ltskdhd1  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(228)

我尝试过在Linux cmd行上使用jq将json转换为csv,但没有成功。如有任何指导帮助,将不胜感激。

{
    "dir/file1.txt": [
      {
        "Setting": {
          "SettingA": "",
          "SettingB": null
        },
        "Rule": "Rulechecker.Rule15",
        "Description": "",
        "Line": 11,
        "Link": "www.sample.com",
        "Message": "Some message",
        "Severity": "error",
        "Span": [
          1,
          3
        ],
        "Match": "[id"
      },
      {
        "Setting": {
          "SettingA": "",
          "SettingB": null
        },
        "Check": "Rulechecker.Rule16",
        "Description": "",
        "Line": 27,
        "Link": "www.sample.com",
        "Message": "Fix the rule",
        "Severity": "error",
        "Span": [
          1,
          3
        ],
        "Match": "[id"
      }
    ],
    "dir/file2.txt": [
      {
        "Setting": {
          "SettingA": "",
          "SettingB": null
        },
        "Rule": "Rulechecker.Rule17",
        "Description": "",
        "Line": 51,
        "Link": "www.example.com",
        "Message": "Fix anoher 'rule'?",
        "Severity": "error",
        "Span": [
          1,
          18
        ],
        "Match": "[source,terminal]\n----\n"
      }
    ]
}

最后,我希望将dir/file1.txtdir/file2.txt作为行显示在矩阵的左侧,将所有键作为列标题显示,并显示相应的值。

| Filename  | SettingA | SettingB | Rule | More columns... |
| -------- | -------------- | -------------- | -------------- | -------------- |
| dir/file1.txt    |             | null | Rulechecker.Rule15 | |
| dir/file1.txt   |             | null | Rulechecker.Rule16 | |
| dir/file2.txt   |             | null | Rulechecker.Rule17  | |
mklgxw1f

mklgxw1f1#

迭代to_entries获得的顶级键值对以访问键名,然后再一次迭代.value中的内容数组以获得数组项。还要注意,示例的最后一个.Match值中出现的换行符不能按原样用于面向行的格式(如CSV)。这里,我选择使用gsub将它们替换为字符串\n
第一个
Demo
如果您只想按照值出现的顺序转储所有值,可以使用.. | scalars遍历文档的各个级别来简化此操作:
第一个
Demo
至于列标题,对于第一种情况,我会手动添加它们,因为您无论如何都要拼写每个值路径。对于后一种情况,它会有点复杂,因为不是所有列都有直接名称(数组Span中的项应该被称为什么?),有些项似乎发生了变化(在第二条记录中,列Rule被称为Check)。但是,您可以沿用第一条记录的名称,并将最深的字段名称保留原样或添加数组索引。可以使用以下方法:
第一个
Demo

相关问题