我的输入数据如下,我需要将其表述为 JSON。在遗留节点上工作并且没有jq(提前提及)
e1
status: up
temp: 140
alarm: none
e2
status: down
temp: 141
alarm: none
e3
status: up
temp: 144
alarm: 2
e4
status: up
temp: 65
alarm: 2
region: us-east
Run Code Online (Sandbox Code Playgroud)
我希望得到以下输出:
{"e1" : { "status": "up", "temp": "140", "alarm": "none"}}
{"e2" : { "status": "down", "temp": "141", "alarm": "none"}}
{"e3" : { "status": "up", "temp": "144", "alarm": "2"}}
{"e4" : { "status": "up", "temp": "65", "alarm": "2", "region": "us-east"}}
Run Code Online (Sandbox Code Playgroud)
我尝试使用awk但无法按键组合结果来解决问题:
awk '!/:/{node=$0} /:/{print "{\"",node,"\"}",":", "{", $0 ,"}" }' inputfile
{" e1 "} : { status: up }
{" e1 "} : { temp: 140 }
{" e1 "} : { alarm: none }
{" e3 "} : { status: down }
{" e3 "} : { temp: 141 }
{" e3 "} : { alarm: none }
{" e3 "} : { status: up }
{" e3 "} : { temp: 144 }
{" e3 "} : { alarm: 2 }
Run Code Online (Sandbox Code Playgroud)
有什么建议 ?
我们将连续的输入行附加在一起的一种awk想法(通过awk/out想法:
awk -F':' ' # input field delimiter is ":"
NF==1 { if (out) # if number of ":" delimited fields is 1 then we are starting a new block, and if "out" is non-empty then ...
print out "}}" # print the previous block to stdout and ...
out="{\"" $1 "\" : { " # start building a new "out"
sep=""
next
}
{ gsub(/^[ ]+/,"",$2) # strip leading spaces from 2nd field
out=out sep "\"" $1 "\": \"" $2 "\""
sep=", "
}
END { if (out) # if non-empty then ...
print out "}}" # flush last "out" to stdout
}
' inputfile
Run Code Online (Sandbox Code Playgroud)
这会生成:
{"e1" : { "status": "up", "temp": "140", "alarm": "none"}}
{"e2" : { "status": "down", "temp": "141", "alarm": "none"}}
{"e3" : { "status": "up", "temp": "144", "alarm": "2"}}
{"e4" : { "status": "up", "temp": "65", "alarm": "2", "region": "us-east"}}
Run Code Online (Sandbox Code Playgroud)