【问题标题】:Jq - print in one line values from different keysJq - 从不同的键打印一行值
【发布时间】:2020-12-18 13:20:51
【问题描述】:

示例 Json 文件:

[
    {
        "Header": {
            "Tenant": "Test-d1",
            "Stage": "dev",
            "ProductType": "b2b",
            "Rcode": 401
        },
        "Body": {
            "error": {
                "code": 401,
                "message": "Unsupported authorization scheme"
            }
        }
    },
    {
        "Header": {
            "Tenant": "2734d7ac0f0e",
            "Stage": "unknown",
            "ProductType": "unknown",
            "Rcode": 404
        },
        "Body": {
            "error": {
                "code": 404,
                "message": "Not found"
            }
        }
    }
]

期望的输出:

Test-d1, dev, b2b, Unsupported authorization scheme, 401
2734d7ac0f0e, unknown, unknown, Not found, 404

所以跳过键,只对某些值感兴趣并形成一行,用逗号或半列或其他分隔符分隔它们。

我能想到的最简单的 jq 过程是将值放入数组并使用 @csv

jq  -r .[] | [ .Header.Tenant, .Header.Stage, .Header.ProductType, .Body.error.message, .Body.error.code ] | @csv

几乎 做我想要的,但是用双引号将每个值括起来。我可以使用其他一些工具来处理双引号,但我确信它应该可以在 jq 本身内实现。

使用 jq 的替代方法有哪些?

谢谢

【问题讨论】:

    标签: arrays sorting search replace jq


    【解决方案1】:

    @csv 保证会生成 CSV,但如果您希望字符串无条件地显示而没有周围的引号,您可以考虑使用 join(", ") 而不是 @csv。由于您表明您对其他一些值分隔符持开放态度,因此您可能还希望考虑@tsv

    jq 程序中的冗余也可以减少,所以你可能会得到:

    .[] 
    | (.Header     | [.Tenant, .Stage, .ProductType]) + 
      (.Body.error | [.message, .code ])
    | @tsv
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多