我有一个包含两列的数据集:
- 十进制数
- 一个长字符串
我想从第二列中提取每个 FBtr 编号(例如,FBtr0072798)并忽略其余部分。
0.850359 EFF=INTRON(MODIFIER|||||drpr|||FBtr0072798|4|1),INTRON(MODIFIER|||||drpr|||FBtr0072799|4|1),INTRON(MODIFIER|||||drpr|||FBtr0309845|4|1),SYNONYMOUS_CODING(LOW|SILENT|atT/atA|I690||CG18171|||FBtr0072800|1|1)
0.473555 EFF=INTRON(MODIFIER|||||drpr|||FBtr0072798|4|1),INTRON(MODIFIER|||||drpr|||FBtr0072799|4|1),INTRON(MODIFIER|||||drpr|||FBtr0309845|4|1),SYNONYMOUS_CODING(LOW|SILENT|agC/agT|S371||CG18171|||FBtr0072800|1|1),UPSTREAM(MODIFIER|||||CG12035|||FBtr0072766||1)
0.969735 EFF=INTRON(MODIFIER|||||drpr|||FBtr0072798|4|1),INTRON(MODIFIER|||||drpr|||FBtr0072799|4|1),INTRON(MODIFIER|||||drpr|||FBtr0309845|4|1),SYNONYMOUS_CODING(LOW|SILENT|gtT/gtC|V366||CG18171|||FBtr0072800|1|1),UPSTREAM(MODIFIER|||||CG12035|||FBtr0072766||1)
我最终想将其转换为长格式,以便每一行都包含第一列中的十进制数字,并与单个 FBtr 数字配对。例如,
0.850359 FBtr0072798
0.850359 FBtr0072799
0.850359 FBtr0309845
0.850359 FBtr0072800
0.473555 FBtr0072798
0.473555 FBtr0072799
0.473555 FBtr0309845
0.473555 FBtr0072800
0.473555 FBtr0072766
0.969735 FBtr0072798
0.969735 FBtr0072799
0.969735 FBtr0309845
0.969735 FBtr0072800
0.969735 FBtr0072766
我一直在尝试逐步执行此操作,首先将 FBtr 编号提取到单独的列中:
0.850359 FBtr0072798 FBtr0072799 FBtr0309845 FBtr0072800
0.473555 FBtr0072798 FBtr0072799 FBtr0309845 FBtr0072800 FBtr0072766
0.969735 FBtr0072798 FBtr0072799 FBtr0309845 FBtr0072800 FBtr0072766
然后从宽格式转换为长格式。
现在我在提取 FBtr 编号时遇到问题。与 unix 相比,我在 python 方面的新手更多,所以我一直在尝试使用 unix,因为我对这种语言更加熟悉。到目前为止,我尝试过的最有前途的事情是使用 sed 重复查找/替换搜索每个术语。
sed -e 's/\(.* \).*\(FBtr[0-9]*\).*\(FBtr[0-9]*\).*\(FBtr[0-9]*\).*\(FBtr[0-9]*\).*\(FBtr[0-9]*\).*/ \1 \2 \3 \4 \5 \6/ g' file.txt
这不仅对所有重复都很丑陋,而且只有在行中出现相同数量的 FBtr 时才有效,不幸的是没有。关于如何在 unix 或 python 中解决这个问题有什么想法吗?
请您参考如下方法:
如果您可以使用 GNU Awk,它的 gensub() 函数可以很酷地让您的生活更简单,
awk -F[[:space:],] '{for(i=1;i<=NF;i++) if (match($i,/FBtr([[:digit:]]+)/)) \
{value=gensub(/^.*FBtr([[:digit:]]+).*$/,"FBtr\\1","g",$i); print $2,value} }' file
0.850359 FBtr0072798
0.850359 FBtr0072799
0.850359 FBtr0309845
0.850359 FBtr0072800
0.473555 FBtr0072798
0.473555 FBtr0072799
0.473555 FBtr0309845
0.473555 FBtr0072800
0.473555 FBtr0072766
0.969735 FBtr0072798
0.969735 FBtr0072799
0.969735 FBtr0309845
0.969735 FBtr0072800
0.969735 FBtr0072766
