gpt4 book ai didi

linux - 将某些列中包含多个分隔条目的文件拆分为单独的行

转载 作者:太空宇宙 更新时间:2023-11-04 12:26:05 26 4
gpt4 key购买 nike

我有一个非常大的文件,其基本格式如下,还有一些额外的字段:

 posA,id1,id2,posB,id3,name,(n additional fields)
1,ENST7,ENSP93,1,ENSG92,Gene1
2,ENST25;ENST76;ENST35,ENSP91;ENSP77;ENSP78,515;544;544,ENSG765,Gene2
3,ENST25;ENST76;ENST35,ENSP91;ENSP77;ENSP78,515;544;544,ENSG765,Gene2
4,ENST54;ENST93,ENSP83;ENSP36,1864;722,ENSG48,Gene3
5,ENST54;ENST93,ENSP83;ENSP36,1864;722,ENSG48,Gene3
6,ENST54;ENST93,ENSP83;ENSP36,1864;722,ENSG48,Gene3

第一行 (posA=1) 每列都有一个条目,不需要修改。对于某些列具有可变数量的多个条目的行,对于第三行 (posA=2),“id1”的第一个条目 (ENST25) 与“id2”的第一个条目 (ENSP91) 和第一个条目配对对于“posB”(515) 等,但具有单个条目的列(例如,“posA”、“id3”、“name”)适用于第 2-4 列中的所有成对条目。除了第 2-4 列之外的一些字段也很少包含多个条目。

我想将包含多个条目的列拆分为单独的行,同时保留其他列的数据,如下所示:

 posA,id1,id2,posB,id3,name,(n additional fields)
1,ENST7,ENSP93,1,ENSG92,Gene1
2,ENST25,ENSP91,515,ENSG765,Gene2
2,ENST76,ENSP77,544,ENSG765,Gene2
2,ENST35,ENSP78,544,ENSG765,Gene2
3,ENST25,ENSP91,515,ENSG765,Gene2
3,ENST76,ENSP77,544,ENSG765,Gene2
3,ENST35,ENSP78,544,ENSG765,Gene2
4,ENST54,ENSP83,1864,ENSG48,Gene3
4,ENST93,ENSP36,722,ENSG48,Gene3
...

解决这个问题的最佳方法是什么?

谢谢!

最佳答案

以你的例子为例,最多会有两个复合属性,然后使用简单的参数扩展和子字符串删除,你可以很容易地完成你想要的,例如

#!/bin/bash

while IFS=, read -r p a1 a2 a3; do
[[ $a1 =~ ';' ]] && {
printf "%s,%s,%s,%s\n" "$p" "${a1%;*}" "${a2%;*}" "$a3"
printf "%s,%s,%s,%s\n" "$p" "${a1#*;}" "${a2#*;}" "$a3"
} || printf "%s,%s,%s,%s\n" "$p" "$a1" "$a2" "$a3"
done < "$1"

哪里 [[ $a1 =~ ';' ]] 检查 $a1 中的 ';',如果找到,则选择 $a1$a2${a1%;*}${a2%;*}。然后对于每个中的第二个属性,使用 ${a1#*;}${a2#*;}

如果 $a1 中没有包含 ';',则打印属性不变。 IFS=, 确保参数在 ',' 上分词。

(注意:您应该在最终脚本中添加文件名是否有效等验证。如果您愿意,也可以使用echo)

示例使用/输出

$ splitattrib.sh file
Pos,Attribute1,Attribute2,Attribute3
1,a,b,-
2,c,e,+
2,d,f,+

关于linux - 将某些列中包含多个分隔条目的文件拆分为单独的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44644076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com