如何使用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有任何其他输入。有太多的案例不适用,不值得列出其中一些。