生成具有格式的json文件

时间:2018-09-25 20:41:48

标签: bash shell

我有一个curl命令,它生成json输出。我想在生成的文件中添加一些字符,以便能够对其进行进一步处理。

命令:

curl -sN --negotiate -u foo:bar "http://hostname/db/tbl_name/" >> db.json

这在for循环下运行,该循环针对db和tbl_name组合运行它。因此,它最终生成了许多json输出(每个表一个),这些输出连接在一起而没有任何定界符。

输出如下:

{“ columns”:[{“ name”:“ tbl_id”,“ type”:“ varchar(50)”},{“ name”:“ cret_timestmp”,“ type”:“ timestamp”},{“名称”:“ updt_timestmp”,“类型”:“时间戳”},{“名称”:“ frst_nm”,“类型”:“ varchar(50)”},{“名称”:“ last_nm”,“类型”: “ varchar(50)”},{“ name”:“ acct_num”,“ type”:“ varchar(15)”},{“ name”:“ r_num”,“ type”:“ varchar(15)”}, {“ name”:“ pid”,“ type”:“十进制(15,0)”},{“ name”:“ ami_id”,“ type”:“ varchar(30)”},{“ name”:“ ssn“,” type“:” varchar(9)“},{” name“:” client_id“,” type“:” varchar(30)“},{” name“:” client_nm“,” type“:” varchar(100)“},{” name“:” info“,” type“:” timestamp“},{” name“:” rmx“,” type“:” varchar(10)“},{” name“ :“ id”,“ type”:“十进制(12,0)”},{“ name”:“ ingest_timestamp”,“ type”:“ string”},{“ name”:“ incr_ingest_timestamp”,“ type”: “ string”}],“ database”:“ db_i”,“ table”:“ db_tbl”} {“ columns”:[{“ name”:“ key”,“ type”:“ varchar(15)”},{ “ name”:“ foo_cd”,“ type”:“ varchar(10)”},{“ name”:“ foo_nm”,“ type”:“ varchar(56)”},{“ name”:“ tmc_regn_cd”, “ type”:“ varchar(10)”},{“ name”:“ tmc_mrkt_cd”,“ type”:“ varchar(20)”},{“ name”:“ mrkt_grp”,“ type”:“ varchar(30 )“},{” name“:” i ngest_timestamp“,” type“:” string“},{” name“:” incr_ingest_timestamp“,” type“:” string“}],”数据库“:” db_i“,” table“:” ss_mv“} {”列“:[{” name“:” bar_src_name“,” type“:” string“},{” name“:” bar_ent_name“,” type“:” string“},{” name“:” from_src“,” type “:” string“},{” name“:” reload“,” type“:” string“},{” name“:” column_mismatch“,” type“:” string“},{” name“:” xx_src_name “,” type“:” string“},{” name“:” xx_ent_name“,” type“:” string“}]],”数据库“:” db_i“,” table“:” test_table“}

所需的输出将以[]开头和结尾输出。另外,我想在列列表开始的末尾之间添加“,”。

因此,例如:如果curl命令针对上面所示的3个表运行,则应创建三个生成的json:

 [{json1},{json2},{json3}]

数字1,2,3 ... etc对应于curl命令中针对不同数据库运行的curl表中的不同表,该数据库的json应该在一个文件中创建,但格式应为

而不是我现在得到的是

 {json1}{json2}{json3}

在上面粘贴的输出中,JSON 1是:

{“ columns”:[{“ name”:“ tbl_id”,“ type”:“ varchar(50)”},{“ name”:“ cret_timestmp”,“ type”:“ timestamp”},{“名称”:“ updt_timestmp”,“类型”:“时间戳”},{“名称”:“ frst_nm”,“类型”:“ varchar(50)”},{“名称”:“ last_nm”,“类型”: “ varchar(50)”},{“ name”:“ acct_num”,“ type”:“ varchar(15)”},{“ name”:“ r_num”,“ type”:“ varchar(15)”}, {“ name”:“ pid”,“ type”:“十进制(15,0)”},{“ name”:“ ami_id”,“ type”:“ varchar(30)”},{“ name”:“ ssn“,” type“:” varchar(9)“},{” name“:” client_id“,” type“:” varchar(30)“},{” name“:” client_nm“,” type“:” varchar(100)“},{” name“:” info“,” type“:” timestamp“},{” name“:” rmx“,” type“:” varchar(10)“},{” name“ :“ id”,“ type”:“十进制(12,0)”},{“ name”:“ ingest_timestamp”,“ type”:“ string”}, {“名称”:“ incr_ingest_timestamp”,“类型”:“字符串”}],“数据库”:“ db_i”,“表”:“ db_tbl”}

JSON 2是:

{“ columns”:[{“ name”:“ key”,“ type”:“ varchar(15)”},{“ name”:“ foo_cd”,“ type”:“ varchar(10)”} ,{“ name”:“ foo_nm”,“ type”:“ varchar(56)”},{“ name”:“ tmc_regn_cd”,“ type”:“ varchar(10)”},{“ name”:“ tmc_mrkt_cd “,” type“:” varchar(20)“},{” name“:” mrkt_grp“,” type“:” varchar(30)“},{” name“:” ingest_timestamp“,” type“:” string “},{”名称“:” incr_ingest_timestamp“,”类型“:”字符串“}],”数据库“:” db_i“,”表“:” ss_mv“}

JSON 3是:

{“ columns”:[{“ name”:“ bar_src_name”,“ type”:“ string”},{“ name”:“ bar_ent_name”,“ type”:“ string”},{“ name”: “ from_src”,“ type”:“ string”},{“ name”:“ reload”,“ type”:“ string”},{“ name”:“ column_mismatch”,“ type”:“ string”},{ “ name”:“ xx_src_name”,“ type”:“ string”},{“ name”:“ xx_ent_name”,“ type”:“ string”}],“数据库”:“ db_i”,“ table”:“ test_table “}

我希望这个要求很明确,在此先感谢,希望通过bash实现这一目标。

4 个答案:

答案 0 :(得分:2)

使用jq -s

  

--slurp/-s:而不是为输入中的每个JSON对象运行筛选器,而是将整个输入流读取为大数组              然后只运行一次过滤器。

这是一个例子:

$ cat file.json
{ "key": "value1" }
{ "key": "value2" }
{ "key":
"value3"}{"key": "value4"}

$ jq -s < file.json
[
  {
    "key": "value1"
  },
  {
    "key": "value2"
  },
  {
    "key": "value3"
  },
  {
    "key": "value4"
  }
]

答案 1 :(得分:1)

我不确定是否正确,但是我认为您正在寻找类似的东西

 echo "[$(cat *.json | paste -sd ',')]" > result.json

这可以通过创建一个以[开始并以]结尾的字符串来工作,在中间,有json文件的内容被串联(cat)并用逗号(在paste的帮助下)。该字符串被echo编辑并写入新文件。

答案 2 :(得分:1)

假设输入采用有效的JSONL格式(每行输入一个JSON文档),则可以将Python脚本嵌入到bash脚本中:

slurpjson_py='
import json, sys
json.dump([json.loads(line.strip()) for line in sys.stdin], sys.stdout, indent=4)
sys.stdout.write("\n")
'

slurpjson() { python -c "$slurpjson_py" "$@"; }

如果称为:

slurpjson <<EOF
{ "first": "document", "starting": "here" }
{ "second": "document", "ending": "here" }
EOF

...输出正确:

[
    {
        "starting": "here",
        "first": "document"
    },
    {
        "second": "document",
        "ending": "here"
    }
]

答案 3 :(得分:0)

我通过运行curl命令并在每次换行时使用“ p”添加了一个成功的

sed 's/$/,/'

然后删除最后一个“,”,并使用:

for i in *; do cat $i | sed '$ s/.$//' | awk '{print "["$0"]"}' > $json_dir/$i; done