我有一个curl命令,它可以生成json输出。我想在生成的文件中添加几个字符,以便能够进一步处理它。
命令:
curl -sN --negotiate -u foo:bar "http://hostname/db/tbl_name/" >> db.json这在一个for循环下运行,该循环为db和tbl_name组合运行它。因此,它最终生成多个json输出(每个表一个),这些输出连接在一起,没有任何分隔符。
输出如下所示:
{“列”:{“名称”:“tbl_id”,“类型”:“varchar(50)”},{“名称”:“cret_timestmp”,“类型”:“时间戳”},{“名称”:“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":"decimal(15,0)"},{"name":"ami_id","type":"varchar(30)"},{"name":"ssn","type":"varchar(9)"},{“名称”:“client_id”,“类型”:“varchar(30)”},{“名称”:“client_nm”,“类型”:“varchar(100)”},{“名称”:“信息”,“类型”:“时间戳”},{“名称”:“rmx”,“类型”:“varchar(10)”},{“名称”:“id”,“类型”:“decimal(12,0)”},{“名称”:“ingest_timestamp”,“类型”:“字符串”},{“名称”:“incr_ingest_timestamp”,“类型”:“字符串”},“数据库”:“db_i”,“表”:“db_tbl”}{“列”:{“名称”:“键”,“类型”:“varchar(15)”},{“名称”:“foo_cd”,“类型”:“varchar(10)”},{“名称”:“foo_nm”,“类型”:“varchar(56)”},{“名称”:“tmc_regn_cd”,“类型”:“varchar(10)”},{“名称”:“tmc_mrkt_cd”,“类型”:“varchar(20)”},{“名称”:“mrkt_grp”,“类型”:“varchar(30)”},{“名称”:“ingest_timestamp”,“类型”:“字符串”},{“名称”:“incr_ingest_timestamp”,“类型”:“字符串”},“数据库”:“db_i”,"table":"ss_mv"}{"columns":{"name":"bar_src_name",“类型”:“字符串”},{“名称”:“bar_ent_name”,“类型”:“字符串”},{“名称”:“from_src”,“类型”:“字符串”},{“名称”:“重新加载”,“类型”:“字符串”},{“名称”:“column_mismatch”,“类型”:“字符串”},{“名称”:“xx_src_name”,“类型”:“字符串”},{“名称”:“xx_ent_name”,“类型”:“字符串”},“数据库”:“db_i”,“表”:“test_table”}
所需的输出是以[]开始和结束输出。我还想在列列表开始的末尾和开头之间包含",“。
因此,对于ex:如果curl命令针对上面所示的3个表运行,那么生成的3个json应该如下所示:
[{json1},{json2},{json3}]编号1、2、3的...etc对应于在针对特定db的for循环中运行的curl命令中的不同表,所述特定db的json应被创建在一个文件中但具有所需的格式。
而不是我现在得到的:
{json1}{json2}{json3}在上面粘贴的输出中,JSON 1是:
{“列”:{“名称”:“tbl_id”,“类型”:“varchar(50)”},{“名称”:“cret_timestmp”,“类型”:“时间戳”},{“名称”:“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":"decimal(15,0)"},{"name":"ami_id","type":"varchar(30)"},{"name":"ssn","type":"varchar(9)"},{“名称”:“client_id”,“类型”:“varchar(30)”},{“名称”:“client_nm”,“类型”:“varchar(100)”},{“名称”:“信息”,“类型”:“时间戳”},{“名称”:“rmx”,“类型”:“varchar(10)”},{“名称”:“id”,“类型”:“decimal(12,0)”},{“名称”:“ingest_timestamp”,“类型”:“字符串”},{“名称”:“incr_ingest_timestamp”,“类型”:“字符串”},“数据库”:“db_i”,“表”:“db_tbl”}
JSON 2是:
{“列”:{“名称”:“键”,“类型”:“varchar(15)”},{“名称”:“foo_cd”,“类型”:“varchar(10)”},{“名称”:“foo_nm”,“类型”:“varchar(56)”},{“名称”:“tmc_regn_cd”,“类型”:“varchar(10)”},{“名称”:“tmc_mrkt_cd”,“类型”:“varchar(20)”},{“名称”:“mrkt_grp”,“类型”:“varchar(30)”},{“名称”:“ingest_timestamp”,“类型”:“字符串”},{“名称”:“incr_ingest_timestamp”,“类型”:“字符串”},“数据库”:“db_i”,“表”:“ss_mv”}
JSON 3是:
{“列”:{“名称”:“bar_src_name”,“类型”:“字符串”},{“名称”:“bar_ent_name”,“类型”:“字符串”},{“名称”:“from_src”,“类型”:“字符串”},{“名称”:“重新加载”,“类型”:“字符串”},{“名称”:“column_mismatch”,“类型”:“字符串”},{“名称”:“xx_src_name”,“类型”:“字符串”},{“名称”:“xx_ent_name”,“类型”:“字符串”},“数据库”:“db_i”,“表”:“test_table”}
我希望需求是明确的,提前感谢,希望通过bash实现这一点。
发布于 2018-09-26 05:01:34
使用jq -s。
JSON --slurp/-s:不是为输入中的每个
对象运行过滤器,而是将整个输入流读取到一个大型数组中,然后只运行一次过滤器。
下面是一个例子:
$ cat file.json
{ "key": "value1" }
{ "key": "value2" }
{ "key":
"value3"}{"key": "value4"}
$ jq -s < file.json
[
{
"key": "value1"
},
{
"key": "value2"
},
{
"key": "value3"
},
{
"key": "value4"
}
]发布于 2018-09-26 16:54:28
我不确定我是否理解正确,但我认为您正在寻找类似于
echo "[$(cat *.json | paste -sd ',')]" > result.json它的工作原理是创建一个以[开头、以]结尾的字符串,中间是用逗号分隔(在paste的帮助下)和连接(cat)的json文件的内容。该字符串被echo编辑并写入到一个新文件中。
发布于 2018-09-27 23:21:20
假设输入采用有效的JSONL格式(每行输入一个JSON文档),则可以在bash脚本中嵌入Python脚本:
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...output是正确的:
[
{
"starting": "here",
"first": "document"
},
{
"second": "document",
"ending": "here"
}
]https://stackoverflow.com/questions/52506397
复制相似问题