如何使用Awk展平JSON?

如何使用Awk展平JSON?,json,bash,awk,Json,Bash,Awk,我想用jq的方式展平JSON字符串,但我的脚本运行的地方没有jqdisponable 我有这样一个输入: [ { "State": { "Status": "running", "foo": "bar" } } ] 并且想要像这样的输出: State.Status: "running" State.foo: "bar" 我认为可以使用awk完成,但不知道从何处开始。这里有一个脚本,它可以对您发布的

我想用
jq
的方式展平JSON字符串,但我的脚本运行的地方没有
jq
disponable

我有这样一个输入:

[
    {
        "State": {
            "Status": "running",
            "foo": "bar"
        }
    }
]
并且想要像这样的输出:

State.Status: "running"
State.foo: "bar"

我认为可以使用
awk
完成,但不知道从何处开始。

这里有一个脚本,它可以对您发布的输入执行您想要的操作,但对任何其他输入执行YMMV操作:

$ cat tst.awk
match($0,/"[^"]+"/) {
    tag = substr($0,RSTART+1,RLENGTH-2)
    $0  = substr($0,RSTART+RLENGTH)
}
$1 == "}"  { name = ""; next }
$NF == "{" { name = tag; next }
$1 !~ /[][]/ {
    match($0,/"[^"]+"/)
    val = substr($0,RSTART,RLENGTH)
    print name "." tag ": " val
}


下面是一个脚本,它可以对您发布的输入执行您想要的操作,但对任何其他输入执行YMMV操作:

$ cat tst.awk
match($0,/"[^"]+"/) {
    tag = substr($0,RSTART+1,RLENGTH-2)
    $0  = substr($0,RSTART+RLENGTH)
}
$1 == "}"  { name = ""; next }
$NF == "{" { name = tag; next }
$1 !~ /[][]/ {
    match($0,/"[^"]+"/)
    val = substr($0,RSTART,RLENGTH)
    print name "." tag ": " val
}


难道你不能把
jq
复制到目标系统吗?它是一个单一的二进制文件,非常简单。用awk无法可靠地完成。即使是GNU awk JSON扩展也有限制,但您可以尝试一下。话虽如此,请发布您的最坏情况,最复杂的示例输入/输出,并且只要您必须处理的其他内容保证始终遵循该格式,那么也许我们可以帮助您进行限制性的破解。如果没有jq,您是否有perl或python可用?我最终使用了python的json模块。@EdMorton awk语言没有图灵完整性?您不能复制吗
jq
到目标系统?它是一个单一的二进制文件,非常简单。用awk无法可靠地完成。即使是GNU awk JSON扩展也有限制,但您可以尝试一下。话虽如此,请发布您的最坏情况,最复杂的示例输入/输出,并且只要您必须处理的其他内容保证始终遵循该格式,那么也许我们可以帮助您进行限制性的破解。如果没有jq,您是否有perl或python可用?我最终使用了python的json模块。@EdMorton awk语言不是图灵完整的?可能值得指出对于OP来说,这种方法的一些限制(f/e,解析
{“Status:“waiting:\'30secondtimeout\”}
不会很好,而一个完全兼容的JSON解析器不会有问题)。我觉得OPs对YMMV和任何其他输入都有足够的警告,并在回答中说YMMV与任何其他输入一样。有太多的情况它不起作用,不值得列出其中的一些。也许值得向OP指出这种方法的一些限制(f/e,解析
{“状态”:“等待:\“30秒超时\\”}
不会很好,而完全兼容的JSON解析器不会有问题).我觉得OPs对YMMV的警告已经够多了,在回答中说YMMV有任何其他输入。有太多的案例不适用,不值得列出其中一些。