2017-07-11 60 views
0

我正在写一个bash脚本来做一些事情。现在它将几个文件复制到正确的目录并运行一些命令。我需要这个bash脚本来编辑一个JSON文件。从本质上讲,这个脚本会将JSON片段附加到存在于file.JSON中的现有JSON对象。我不能只追加数据,因为JSON片段必须是现有JSON对象的一部分(应添加到tracks数组中)。那么这可能与一个bash脚本有关吗?我应该只编写另一个python或R脚本来处理这个JSON逻辑,还是有更好的解决方案。谢谢你的帮助。与bash脚本一起使用JSON

file.JSON looks like this... 
    { 
     "formatVersion" : 1, 
     "tracks" : [ 
      { 
      "key" : "Reference sequence", 
      "chunkSize" : 20000, 
      "urlTemplate" : "seq/{refseq_dirpath}/{refseq}-", 
      "storeClass" : "JBrowse/Store/Sequence/StaticChunked", 
      "type" : "SequenceTrack", 
      "seqType" : "dna", 
      "category" : "Reference sequence", 
      "label" : "DNA" 
      }, 
      { 
      "type" : "FeatureTrack", 
      "label" : "gff_track1", 
      "trackType" : null, 
      "key" : "gff_track1", 
      "compress" : 0, 
      "style" : { 
       "className" : "feature" 
      }, 
      "storeClass" : "JBrowse/Store/SeqFeature/NCList", 
      "urlTemplate" : "tracks/gff_track1/{refseq}/trackData.json" 
      }, 
      { 
      "storeClass" : "JBrowse/Store/SeqFeature/NCList", 
      "style" : { 
       "className" : "feature" 
      }, 
      "urlTemplate" : "tracks/ITAG2.4_gene_models.gff3/{refseq}/trackData.json", 
      "key" : "ITAG2.4_gene_models.gff3", 
      "compress" : 0, 
      "trackType" : null, 
      "label" : "ITAG242.4_gene_models.gff3", 
      "type" : "FeatureTrack" 
      }, 
      { 
      "urlTemplate" : "g-231FRL.bam", 
      "storeClass" : "JBrowse/Store/SeqFeature/BAM", 
      "label" : "g-1FRL.bam", 
      "type" : "JBrowse/View/Track/Alignments2", 
      "key" : "g-1FRL.bam" 
      } 
     ] 
    } 

the JSON snippet looks like this ... 

     { 
     "urlTemplate": "AX2_filtered.vcf.gz", 
     "label": "AX2_filtered.vcf.gz", 
     "storeClass": "JBrowse/Store/SeqFeature/VCFTabix", 
     "type": "CanvasVariants" 
     } 

回答

2

请你帮个忙,并安装jq,那么它的那样简单:

jq -n 'input | .tracks += [inputs]' file.json snippet.json > out.json 

试图修改结构化数据(如JSON)是一个傻瓜的差事没有一个适当的解析器和jq真叫很容易。

但是,如果你喜欢做这件事通过Python的(虽然这将是这类任务的矫枉过正),这几乎是直线前进与jq

import json 

with open("file.json", "r") as f, open("snippet.json", "r") as s, open("out.json", "w") as u: 
    data = json.load(f) # parse `file.json` 
    data["tracks"].append(json.load(s)) # parse `snippet.json` and append it to `.tracks[]` 
    json.dump(data, u, indent=4) # encode the data back to JSON and write it to `out.json` 
+0

优秀的解决方案,正是我寻找。干杯! – Developing