[A]
66 67 1 0 0 0 0
67 69 2 0 0 0 0
67 71 1 0 0 0 0
68 69 1 0 0 0 0
72 73 2 3 0 0 0
72 74 1 0 0 0 0
M END
> <DRUGBANK_ID>
DB00035
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$
[B]
66 67 1 0 0 0 0
67 69 2 0 0 0 0
67 71 1 0 0 0 0
68 69 1 0 0 0 0
72 73 2 3 0 0 0
72 74 1 0 0 0 0
M END
> <DRUGBANK_ID>
DB00036
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$
[C]
66 67 1 0 0 0 0
67 69 2 0 0 0 0
67 71 1 0 0 0 0
68 69 1 0 0 0 0
72 73 2 3 0 0 0
72 74 1 0 0 0 0
M END
> <DRUGBANK_ID>
DB00039
> <ALOGPS_SOLUBILITY>
1.10e-02333
$$$$
我有上面的sdf文件,我想提取那些包含DRUGBANK_ID = DB00035和DB00039的行,这意味着我要提取[A]和[C]内容。每个文件以$$$$结尾。在我的sdf文件中包含7000多种这样的格式,提取我想要的模式的有效方法是什么?谢谢。
[A]
66 67 1 0 0 0 0
67 69 2 0 0 0 0
67 71 1 0 0 0 0
68 69 1 0 0 0 0
72 73 2 3 0 0 0
72 74 1 0 0 0 0
M END
> <DRUGBANK_ID>
DB00035
> <ALOGPS_SOLUBILITY>
1.10e-01 g/l
$$$$
[C]
66 67 1 0 0 0 0
67 69 2 0 0 0 0
67 71 1 0 0 0 0
68 69 1 0 0 0 0
72 73 2 3 0 0 0
72 74 1 0 0 0 0
M END
> <DRUGBANK_ID>
DB00039
> <ALOGPS_SOLUBILITY>
1.10e-02333
$$$$
答案 0 :(得分:1)
读入行并创建一个分组变量g.all
,其中包含文件每行的组件。也就是说,对于第一组的每一行,它是1,对于第二组的每一行,它是2,依此类推。确定每个所需字符串所在的组g.ok
,然后从这些组中提取所有行:
L <- readLines("myfile")
g.all <- cumsum(grepl("^\\[", L))
g.ok <- g.all[grep("DB00035|DB00039", L)]
L[g.all %in% g.ok]
已添加要使用$$$$作为标记,请将第二行替换为:
g.all <- rev(cumsum(grepl("$$$$", rev(L), fixed = TRUE)))