使用 awk 将原始数据转换为 json

mon*_*onk 2 bash awk

我的输入数据如下,我需要将其表述为 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)

有什么建议 ?

mar*_*rkp 6

我们将连续的输入行附加在一起的一种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)