bash将数组拆分为具有动态名称的单独文件

时间:2018-08-22 16:01:49

标签: arrays json node.js bash jq

作为对我正在使用的模拟工具的回应,我收到了以下答复。

{
  "mappings" : [ 
{
"id" : "bcf3559f-7ff7-406b-a4f1-6d3e9ac00e63",
"name" : "Hellow world 2",
"request" : {
  "url" : "/hello-world-2",
  "method" : "POST"
},
"response" : {
  "status" : 200,
  "body" : "\nBody content for stub 3\n\n",
  "headers" : { }
},
"uuid" : "bcf3559f-7ff7-406b-a4f1-6d3e9ac00e63",
"persistent" : true,
"priority" : 5
  }, 
{
"id" : "9086b24f-4f5e-465a-bbe5-73bbfb82cd5c",
"name": "Hello world",
"request" : {
  "url" : "/hello-world",
  "method" : "ANY"
},
"response" : {
  "status" : 200,
  "body" : "Hi!"
},
"uuid" : "9086b24f-4f5e-465a-bbe5-73bbfb82cd5c"
} ]
}

我想知道如何使用对象ID命名的文件将每个对象分成自己的文件。

例如:

bcf3559f-7ff7-406b-a4f1-6d3e9ac00e63.json

bcf3559f-7ff7-406b-a4f1-6d3e9ac00e63.json

到目前为止,我已经了解到了这一点,但无法通过它:

jq -c '.mappings = (.mappings[] | [.])' mappings.json |
  while read -r json ; do
  N=$((N+1))
  jq . <<< "$json"  > "tmp/file${N}.json"
done

2 个答案:

答案 0 :(得分:1)

我建议一行打印ID,另一行打印相应的对象。例如:

jq -c '.mappings[] | .id, .' mappings.json |
    while read -r id ; do
    echo "id=$id"
    read -r json
      jq . <<< "$json"  > "tmp/${id}.json"
done

答案 1 :(得分:0)

我会改写一个简单的Python脚本(或您喜欢的通用编程语言中的等效脚本)。

constructor

这样至少在import sys, json d = json.load(sys.stdin): for o in d['mappings']: with open(os.path.join('tmp', o['id'] + '.json'), 'w') as f: json.dump(o, f) 内置某种jq内置功能之前,这样会更高效且更不易出错:

output
相关问题