【发布时间】:2017-07-03 17:52:25
【问题描述】:
我有一个包含两列的数据集:
- 十进制数
- 一长串
我想从第二列中提取每个 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 编号时遇到问题。我在 python 方面比 unix 更新手,所以我一直在尝试使用 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,请参考下面我的回答。