首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >透视SNP表,使用Bash将CSV文件转换为JSON

透视SNP表,使用Bash将CSV文件转换为JSON
EN

Stack Overflow用户
提问于 2022-04-26 06:28:14
回答 1查看 129关注 0票数 0

我在处理GWAS数据。需要帮助。

我的数据如下:

代码语言:javascript
复制
IID,rs098083,kgp794789,rs09848309,kgp8300747,.....
63,CC,AG,GA,AA,.....
54,AT,CT,TT,AG,.....
12,TT,GA,AG,AA,.....
.
.
.

如前所述,我总共有512行和200万列。

期望产出:

代码语言:javascript
复制
SNP,Genotyping
rs098083,{
"CC" : [ 1, 63, 6, 18, 33, ...],
"CT" : [ 2, 54, 6, 7, 8, ...],
"TT" : [ 4, 9, 12, 13, ...],
"AA" : [86, 124, 4, 19, ...],
"AT" : [8, 98, 34, 74, ....],
.
.
.
}     
kgp794789,{
"CC" : [ 1, 63, 6, 18, 33, ...],
"CT" : [ 2, 5, 6, 7, 8, ...],
"TT" : [ 4, 9, 12, 13, ...],
"AA" : [86, 124, 4, 19, ...],
"AT" : [8, 98, 34, 74, ....],
.
.
.

}
rs09848309,{
"CC" : [ 1, 63, 6, 18, 3, ...],
"CT" : [ 2, 5, 6, 7, 8, ...],
"TT" : [ 4, 9, 24 13, ...],
"AA" : [86, 134, 4, 19, ...],
"AT" : [8, 48, 34, 44, ....],
.
.
.

如前所述,在旋转之后,我应该有一个包含200万行和2列的JSON文件。行的SNP列包含SNP的ID。genotyping列将包含一个JSON。这个BLOB将是一组键值对。关键是特定基因型(例如CC、CT、TT、.)值是带有匹配密钥的基因型的IID的列表。

输出格式为“带有嵌入式JSON的CSV”

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-26 09:28:14

下面是一种使用stedolan/jq的方法

代码语言:javascript
复制
jq -Rrn '
  [ inputs / "," ] | transpose | .[0][1:] as $h | .[1:][]
  | .[1:] |= [reduce ([.,$h] | transpose[]) as $t ({}; .[$t[0]] += [$t[1]]) | @text]
  | join(", ")
'
代码语言:javascript
复制
rs098083, {"CC":["63"],"AT":["54"],"TT":["12"]}
kgp794789, {"AG":["63"],"CT":["54"],"GA":["12"]}
rs09848309, {"GA":["63"],"TT":["54"],"AG":["12"]}
kgp8300747, {"AA":["63","12"],"AG":["54"]}

演示

如果if应编码为JSON编号,则添加tonumber

代码语言:javascript
复制
jq -Rrn '
  [ inputs / "," ] | transpose | (.[0][1:] | map(tonumber)) as $h | .[1:][]
  | .[1:] |= [reduce ([.,$h] | transpose[]) as $t ({}; .[$t[0]] += [$t[1]]) | @text]
  | join(", ")
'
代码语言:javascript
复制
rs098083, {"CC":[63],"AT":[54],"TT":[12]}
kgp794789, {"AG":[63],"CT":[54],"GA":[12]}
rs09848309, {"GA":[63],"TT":[54],"AG":[12]}
kgp8300747, {"AA":[63,12],"AG":[54]}

演示

如果您的最终目标是无论如何都有一个JSON表示,那么省略对原始输出的格式化,类似这样的内容可能会做到:

代码语言:javascript
复制
jq -Rn '
  [ inputs / "," ] | transpose | .[0][1:] as $h | reduce .[1:][] as $t (
    {}; .[$t[0]] = reduce ([$t[1:],$h] | transpose[]) as $i (
      {}; .[$i[0]] += [$i[1]]
    )
  )
'
代码语言:javascript
复制
{
  "rs098083": { "CC": ["63"], "AT": ["54"], "TT": ["12"] },
  "kgp794789": { "AG": ["63"], "CT": ["54"], "GA": ["12"] },
  "rs09848309": { "GA": ["63"], "TT": ["54"], "AG": ["12"] },
  "kgp8300747": { "AA": ["63", "12"], "AG": ["54"] }
}

演示 (手动格式化,以便与以前的解决方案相比较容易)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72009290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档