我有一个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实现这一目标。
答案 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