Board logo

标题: [文本处理] 【已解决】批处理如何提取txt文本里特定行中指定内容? [打印本页]

作者: sweet惜缘    时间: 2016-9-19 11:38     标题: 【已解决】批处理如何提取txt文本里特定行中指定内容?

如何批量提取hsa:后面的内容?

database.txt内容如下:

A<b>G Protein-coupled receptors</b>
B  Rhodopsin family
C    Acetylcholine (muscarinic)
D      muscarinic cholinergic receptor M1 [HSA:1128] [KO:K04129]
E        Pirenzepine [DG:DG00026]
F          D08389  Pirenzepine (INN)        Antagonist
F          D01297  Pirenzepine hydrochloride (USAN)        Antagonist
F          D05276  Pirenzepine hydrochloride hydrate (JP17)        Antagonist
E        Dicycloverine [DG:DG00032]
F          D07820  Dicycloverine (INN)        Antagonist
F          D00717  Dicyclomine hydrochloride (JAN/USP)        Antagonist
D      muscarinic cholinergic receptor M2 [HSA:1129] [KO:K04130]
E        Oxybutynin [DGG00478]
F          D00465  Oxybutynin (USAN/INN)        Antagonist
F          D00722  Oxybutynin chloride (USP)        Antagonist
E        Alvameline
F          D02876  Alvameline maleate (USAN)        Antagonist
E        Esoxybutynin
F          D04057  Esoxybutynin chloride (USAN)       



提取如上部分有颜色部分,然后将结果输出到结果.txt文档中(每一行最前面的字母代表其的类别,即D为一大类,E是属于D中的一类,而F是属于E中的一类)
注:有的drug没有DG编号以及classification则空出

HSA (D)                      DG (E)                             Drug(F)                        classification
1128                          DG00026                               D08389                           Antagonist
1128                          DG00026                               D01297                           Antagonist
1128                          DG00026                               D05276                           Antagonist
1128                          DG00032                               D07820                           Antagonist
1128                          DG00032                               D00717                           Antagonist
1129                          DG00478                               D00465                           Antagonist
1129                          DG00478                               D00722                           Antagonist
1129                                                                       D02876                           Antagonist
1129                                                                       D04057




非常感谢!!!!!

作者: pcl_test    时间: 2016-9-19 12:47

本帖最后由 pcl_test 于 2016-9-28 13:28 编辑
  1. #*第三方http://www.bathome.net/s/tool/index.html?key=gawk
  2. #*&cls&gawk -f "%~f0" "database.txt">"result.txt"&pause&exit
  3. BEGIN{
  4.     print "HSA(D)\t\tDG(E)\t\tDrug(F)\t\tclassification";
  5.     hsa="";
  6.     dg="";
  7. }
  8. {
  9.     if(match($0,/\[HSA:([^\[]*)\]/,d)){gsub(/[[:space:]]+/,",",d[1]);hsa=d[1];dg="~"}
  10.     if(match($0,/\[DG:([^\[]*)\]/,e))dg=e[1];
  11.     if(match($0,/[[:space:]]+(D[0-9]{5})[[:space:]]*.*[[:space:]]+(\S+)[[:space:]]*$/,drug)){
  12.         print hsa"\t\t"dg"\t\t"drug[1]"\t\t"drug[2];
  13.     }
  14. }
复制代码

作者: xhsamuel    时间: 2016-9-19 13:26

版主是高手啊 我的问题也帮忙指点下呗
作者: sweet惜缘    时间: 2016-9-19 15:02

回复 2# pcl_test


    斑竹大大超级厉害~~~崇拜!!!献上我的膝盖~
作者: sweet惜缘    时间: 2016-9-28 12:39

本帖最后由 pcl_test 于 2016-9-28 13:08 编辑

回复 2# pcl_test

大神,有个问题很棘手,就是我的原始文件中还有C开头行的HSA,您编的程序会遗漏到此种类型,我自己改了下,运行后应该搜全了,但是像下面这样的
C    survivin (BIRC5) [HSA:332] [KO:K08731]
D      Gataparsen [DGG01431]
E        D09909  Gataparsen (USAN/INN)        Antisense
E        D09910  Gataparsen sodium (USAN)        Antisense
D      Sepantronium
E        D10164  Sepantronium bromide (JAN/USAN)        Inhibitor
B  Nucleic acid
C    DNA
D      D00343  Ifosfamide (JAN/USP/INN)
D      D10623  Dianhydrogalactitol (USAN/INN)
C    DNA synthesis
D      Bleomycin [DG:DG00705]
E        D07535  Bleomycin (INN)        Inhibitor
E        D02177  Bleomycin sulfate (JP17/USP)        Inhibitor
E        D03229  Bleomycin hydrochloride (JP17)        Inhibitor

本来得到的结果应该是
332        DG01431        D09909        Antisense
332        DG01431        D09910        Antisense
332        DG01431        D10164        Inhibitor

现在得到的结果是,事实上红色部分不属于HSA:332,但他也搜集进去了,这样就会出现错误,应该如何改程序呢?

332        DG01431        D09909        Antisense
332        DG01431        D09910        Antisense
332        DG01431        D10164        Inhibitor
332        DG00705        D07535        Inhibitor
332        DG00705        D02177        Inhibitor
332        DG00705        D03229        Inhibitor

作者: pcl_test    时间: 2016-9-28 13:36

本帖最后由 pcl_test 于 2016-9-28 13:47 编辑

回复 5# sweet惜缘

如何让程序知道红色部分不属于HSA:332,你把规律总结出来再说吧
求助时,务必在顶楼一次性把问题和结果交代清楚,解答者一般只看顶楼的描述,不要让解答者去猜、去帮你找规律,另外楼主如果经常要处理数据还是学习一门语言吧,老是这种提取字符串的问题,我是不感兴趣了
作者: sweet惜缘    时间: 2016-9-28 15:10

回复 6# pcl_test


    好的~辛苦大大了~我自己擅长的是matlab,但是感觉批处理提取字符串好用一点,自己学习了一些,但还是属于小白阶段。仍旧感谢




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2