【问题标题】:Creating nested Json object using JQ使用 JQ 创建嵌套的 Json 对象
【发布时间】:2017-10-31 03:21:33
【问题描述】:

我需要获取以下Json输入的Exon中的值并用“;”分割它并转换为嵌套 JSON,如下面的预期输出部分所示

示例输入

  {  
   "regions":[  
      {  
         "metric":"GENE1",
         "value":[  
            {  
               "metric":"Exons",
               "value":[  
                  "GENE1;chr1;45656;5656667"    
               ],
               "type":"set"
            },
            {  
               "metric":"Precent_no_call",
               "value":4.22623,
               "type":"simple"
            },
            {  
               "metric":"Total_NoCall_bases",
               "value":112533,
               "type":"simple"
            }
         ],
         "type":"metrics-set"
      },
      {  
         "metric":"GENE2",
         "value":[  
            {  
               "metric":"Exons",
               "value":[  
                  "GENE2_Exon5;chr1;45656;5656667",
                  "GENE2_Exon10;chr1;45656;5656667"                 
               ],
               "type":"set"
            },
            {  
               "metric":"Precent_no_call",
               "value":0.746464,
               "type":"simple"
            },
            {  
               "metric":"Total_NoCall_bases",
               "value":16842,
               "type":"simple"
            }
         ],
         "type":"metrics-set"
      }
   ]
}

预期输出

{  
   "regions":[  
      {  
         "metric":"GENE1",
         "value":[  
            {  
               "metric":"Exons",
               "value":[  
                  "GENE1",
                  {  
                     "chromosome":"chr1",
                     "start":45656,
                     "end":5656667
                  }
               ],
               "type":"set"
            },
            {  
               "metric":"Precent_no_call",
               "value":4.22623,
               "type":"simple"
            },
            {  
               "metric":"Total_NoCall_bases",
               "value":112533,
               "type":"simple"
            }
         ],
         "type":"metrics-set"
      },
      {  
         "metric":"GENE2",
         "value":[  
            {  
               "metric":"Exons",
               "value":[  
                  "GENE2_Exon5",
                  {  
                     "chromosome":"chr1",
                     "start":45656,
                     "end":5656667
                  },
                  "GENE2_Exon10",
                  {  
                     "chromosome":"chr1",
                     "start":45656,
                     "end":5656667
                  }
               ],
               "type":"set"
            },
            {  
               "metric":"Precent_no_call",
               "value":0.746464,
               "type":"simple"
            },
            {  
               "metric":"Total_NoCall_bases",
               "value":16842,
               "type":"simple"
            }
         ],
         "type":"metrics-set"
      }
   ]
}

注意

另外,这与这里的问题有关:- Converting comma separated file to nested objects json in jq

提前感谢您的帮助。

我从逗号分隔的输入文件中尝试的解决方案(请参阅我发布的另一个问题)

def parse:
  [
      inputs                     # read lines
    | split(",")                 # split into columns
    | select(length>0)           # eliminate blanks
    | .[:1] + [.[1:-3]] + .[-3:] # normalize columns

  ]
;
def simple(n;v): {metric:n, value:v|tonumber, type:"simple"};
def set(n;v):    {metric:n, value:v,          type:"set"};
def chr(c;s;e):  {chromsome:c, start:s, end:e}; 
def region:
  set(.[0]; [
      set("Exons";  (.[1] | tostring | split(";") |.[0]); 
      chr((.[1] | tostring | split(";") |.[1]),(.[1] | tostring | split(";") |.[2]),(.[1] | tostring | split(";") |.[3]))
     ]

     ),
      simple("Fraction of bases"; .[5]),
      simple("Total_bases"; .[6])
    ]
  )
;
{
   "Regions": parse | map(region)
}

我无法循环并递归读取。

【问题讨论】:

  • 请展示您尝试过的内容以及遇到的问题。 SO 不是免费的编码服务。
  • 嗨,Dat,我对使用 Jq 比较陌生,而且我也不是专业的软件工程师。我的专长是基因组学和脚本。我确实尝试通过创建一个从我之前的答案中使用的 JQ 函数来使其工作,我无法拆分子对象并且它正在打印整行。我将编辑问题并添加我尝试过的内容。谢谢你的建议。我会记住以后的帖子。

标签: json bioinformatics jq


【解决方案1】:

由于底层需求已经足够清晰,我组装了以下解决方案,其行为与示例完全一致。但是,更高级别的要求相当粗略,因此您可能需要进行一些调整。

底层需求(关于转换字符串)可以如下实现:

# Input: a string
def gene2object:
  split(";")
  | [.[0], { chromosome: .[1], 
             start: (.[2]|tonumber),
             end:   (.[3]|tonumber)} ];

现在可以很简单地编写如下解决方案:

walk( if type == "object" and .metric == "Exons" 
      then .value |= (map(gene2object)|add) 
      else .
      end )

标准调用(沿着:jq -f program.jq input.json)产生的输出与描述的完全一样,所以我不会在这里重复。

如果你的jq没有walk/1,那么你可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq中搜出它的官方定义 即搜索:def walk

【讨论】:

猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多