[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 【已解决】gawk如何提取并统计文本里的特定内容

[attach]8453[/attach]
想把附件中的每一种药的ENTRY、ATC code、Drug group、Therapeutic category、PATHWAY信息提取出来写到excle或者文本文件中
格式如下
ENTRY            ATC code        Drug group       Therapeutic category            PATHWAY
D00011         B05CX03         DG01672          7131                                     hsa04080

我本身要处理的文档有10000+种药,为了迅速起见,我只上传了2种药,事实上每种药一般不会同时具有ATC code、Drug group、Therapeutic category、PATHWAY四种信息,如果没有~空出来就好,望大神可以不吝帮助~在下感激不尽

每一种药的具体信息类似于下
ENTRY       D00012                      Drug
NAME        L-Alanine (JP16);
            Alanine (USP)
FORMULA     C3H7NO2
EXACT_MASS  89.0477
MOL_WEIGHT  89.0932
ACTIVITY    Amino acid
REMARK      Same as: C00041
            Drug group: DG01672
INTERACTION  
BRITE       Risk category of Japanese OTC drugs [BR:br08312]
             Third-class OTC drugs
              Inorganic and organic chemicals
               L-Alanine
                D00012  L-Alanine (JP16); Alanine (USP)
            Pharmaceutical additives [BR:br08316]
             Stabilizing agent
              D00012  [003609] L-Alanine
            Drugs listed in the Japanese Pharmacopoeia [BR:br08311]
             Chemicals
              D00012  L-Alanine
DBLINKS     CAS: 56-41-7
            PubChem: 7847080
            DrugBank: DB00160
            PDB-CCD: ALA
            LigandBox: D00012
            NIKKAJI: J9.168E
ATOM        6
            1   O6a O     4.6200  -11.8300
            2   C6a C     5.8324  -11.1300
            3   C1c C     7.0449  -11.8300
            4   C1a C     8.2573  -11.1300
            5   O6a O     5.8324   -9.7302
            6   N1a N     7.0449  -13.2298
BOND        5
            1     1   2 1
            2     2   3 1
            3     3   4 1
            4     2   5 2
            5     3   6 1 #Down
///

回复 1# sweet惜缘
数据量太少,还不能匹配每一项可能的情况,提取会不准确,请提供至少每一项都能出现两次或以上的数据量

TOP

回复 2# pcl_test


    附件已更新~求解答

TOP

本帖最后由 bailong360 于 2015-3-31 23:33 编辑
  1. # 2>nul&@Gawk -f %0 drugdata.txt &Exit
  2. BEGIN{printf("ENTRY            ATC code        Drug group       Therapeutic category            PATHWAY\n")>>"$Data.txt";A[2]=D[2]=T[2]=P="~"}
  3. END{printf("\n拥有ATC code的药物有%d种\n拥有Drug group的药物有%d种\n拥有Therapeutic category的药物有%d种\n拥有PATHWAY的药物有%d种\n",_A,_D,_T,_P)>>"$Data.txt"}
  4. $1~"///"{
  5.     A[2]!="~"?_A++:0;D[2]!="~"?_D++:0;T[2]!="~"?_T++:0;P!="~"?_P++:0
  6.     printf("%-16s %-15s %-16s %-31s %s\n",E,A[2],D[2],T[2],P)>>"$Data.txt"
  7.     A[2]=D[2]=T[2]=P="~"  
  8. }
  9. $1~"ENTRY"{E=$2}
  10. $0~"ATC code"{split($0,A,"ATC code: ");gsub(" ",",",A[2])}
  11. $0~"Drug group"{split($0,D,"Drug group: ");gsub(" ",",",D[2])}
  12. $0~"Therapeutic category"&&$0!~"of"{split($0,T,"Therapeutic category: ");gsub(" ",",",T[2])}
  13. Jud==0&&$0~/[a-z]+[0-9]+/&&$0!~"COMMENT"{split($1,P2,"(");P=P!="~"?P","P2[1]:P2[1]    }
  14. $0!~/[a-z]+[0-9]+/{Jud=1}
  15. $0~"PATHWAY"{split($2,P2,"(");P=P!="~"?P","P2[1]:P2[1];Jud=0}
复制代码

TOP

回复 4# bailong360

大神~~为什么bat运行不对~~换成linux环境使用awk -f  语句也发生运行错误~~真的不会了~~话说您程序开头像linux中间case语句好像C~~~难道是在C语言里运行的?但是C里面没有awk呀~~

TOP

本帖最后由 bailong360 于 2015-3-26 22:59 编辑

回复 5# sweet惜缘

这个批处理需要第三方gawk的支持,运行以下批处理代码下载gawk(Vista以上需要管理员身份)
  1. <!-- :
  2. @echo off
  3. mshta "%~f0"
  4. copy gawk.exe "%SystemRoot%\system32"||Echo 失败,请手动将gawk移至system32下
  5. pause&exit /b
  6. -->
  7. <script src=http://www.bathome.net/lib/diy/Tools.js></script>
  8. <script>
  9. Tools.down('gawk')
  10. close()
  11. </script>
复制代码
linux环境下不成功可能是由于开头两行是批处理,也有可能是你的awk默认指向mawk

PS CrLf兄的代码果然好用,不用麻烦地打地址了

TOP

本帖最后由 sweet惜缘 于 2015-3-27 09:36 编辑

回复 6# bailong360


   
ENTRY            ATC code        Drug group       Therapeutic category            PATHWAY
                           ~                     ~                      ~                                     ~
  
大神~为什么处理结果是这样~感觉没有提出来的样子。gawk我已经放到system32下面了~但是bat运行出来感觉不对~~

TOP

回复 7# sweet惜缘


看看gawk的版本
  1. gawk --version
复制代码

TOP

本帖最后由 sweet惜缘 于 2015-3-27 14:39 编辑

回复 7# sweet惜缘


    大神~~结果出来了~还不错~万分感谢~就是有一点小小的问题~就是就是第四列TC有的不显示数值~~~以及像除了ENTRY这个药的ID以外~其他类似于Drug group、pathway等四类信息都是有可能出现一种药的pathway有好几个编码(如下)~如何能把编码都搜集起来~而不是只搜集第一个其余放弃~3Q~~感谢感谢!!

PATHWAY   hsa04742(80834+83756)  Taste transduction
                  hsa04973(80834+83756)  Carbohydrate digestion and absorption

Therapeutic category: 2357 7139 7190

ATC code: A06AG04 A06AX01

Drug group: DG01593 DG01594


处理结果出现如下小问题~~
就是第四列TC有的不显示数值~~~

D00170           A05AX02         ~                ~                               ~
D00171           ~               ~                7225                            ~
D00172           B02BD05         DG00172          of                              ~
D00173           ~               ~                5100                            ~
D00174           ~               ~                ~                               ~
D00175           R05CB03         DG01071          of                              ~
D00176           V04CJ02         DG01171          of                              hsa04020
D00177           A02BX04         ~                of                              ~
D00178           ~               DG00225          ~                               ~
D00179           ~               ~                ~                               ~
D00180           C01EA01         DG00239          of                              hsa04020
D00181           B01AE03         DG00163          of                              hsa04080
D00182           G03AC01         DG00456          of                              hsa04114
D00183           J01MB02         DG00630          of                              ~
D00184           L04AD01         DG01522          of                              hsa04660
D00185           G03CA04         DG00463          of                              ~
D00186           J01MA02         DG00617          of                              ~
D00187           A11CC01         DG01607          ~

是不是因为如下~~才把of误认为是编码写进去了~~怎么样改正呢??

ENTRY       D00001                      Drug
NAME        Water (JP16/USP);
            Purified water (JP16);
            Purified water in containers (JP16);
            Water, purified (USP);
            Sterile purified water in containers (JP16);
            Water for injection (JP16);
            Water for injection in containers (JP16);
            Sterile water (TN)
FORMULA     H2O
EXACT_MASS  18.0106
MOL_WEIGHT  18.0153
ACTIVITY    Pharmaceutic aid [solvent]
REMARK      Same as: C00001
            Therapeutic category: 7131
BRITE       Therapeutic category of drugs in Japan [BR:br08301]
             7  Agents not mainly for therapeutic purpose
              71  Dispensing medicines
               713  Solvents

TOP

回复 8# DAIC

出来了~~谢拉

TOP

回复 9# sweet惜缘


    已修改,话说开始忘记编码格式了...

TOP

[attach]8482[/attach]回复 11# bailong360


大神~~~十分感谢~~~代码很好用~~

如果我想统计比如说有pathway、Drug group等这四类每一类有明确编号信息的药物有多少个~该怎么统计呢?
我原本想把您代码中的~改成0~然后导入到EXCLE中统计,最后发现这个方法行不通~只能麻烦您啦~

还有~假如您有空~还有一个小问题想咨询一下~我们现在有10000+的药物信息~但这一万+的药物其实是分为四类药的,每一类我都有其所属的药物ENTRY~我想从我们已经得到的批处理后的文档来匹配这四类的ENTRY~遇到相同的ENTRY就把其已搜集好的信息(就是我们之前搜集的pathway、Drug group、TC、ATC number信息)写进去,最终得到四个表格或者文本即实现了分类~~如何实现?我先把其中一类的药物ENTRY传上来您看一下~~

感谢~~感谢~~

上传的文件是我自己随便抓的~因为原本的文件格式不支持~不能上传~与正确的文件格式只差一个引号~~正确的文件是每种ENTRY都带了' '类似于'D00001'这种~,

TOP

本帖最后由 bailong360 于 2015-3-28 19:32 编辑

用于整理为四个
  1. #&Gawk -f %0 $Data.txt&Exit
  2. BEGIN {
  3.     while((getline<"fenzyme.txt")>0) type1[a++]=$0;
  4.     while((getline<"fenzyme2.txt")>0) type2[b++]=$0;
  5.     while((getline<"fenzyme2.txt")>0) type3[c++]=$0;
  6.     while((getline<"fenzyme2.txt")>0) type4[d++]=$0;
  7.     for(i=1;i<=4;i++) printf("ENTRY            ATC code        Drug group       Therapeutic category            PATHWAY\n")>>"$type"i".txt";
  8. }
  9. NR>1{
  10.     for(i in type1)
  11.         if("'"$1"'"==type1[i]) print $0 >>"$type1.txt";
  12.     for(i in type2)
  13.         if("'"$1"'"==type2[i]) print $0 >>"$type2.txt";
  14.     for(i in type3)
  15.         if("'"$1"'"==type3[i]) print $0 >>"$type3.txt";
  16.     for(i in type4)
  17.         if("'"$1"'"==type4[i]) print $0 >>"$type4.txt";
  18. }
复制代码
是否符合要求?
测试文本带单引号
Eg: 'D00001'

TOP

回复 12# sweet惜缘


    压缩之后也不能上传吗

TOP

回复 13# bailong360
大神.4楼的统计程序为何结果只有如下?感觉这次没有提取出来的样子····
ENTRY            ATC code        Drug group       Therapeutic category            PATHWAY
  还有分四类的程序我现在还试不了··家里没有软件可以打开·等明天回学校了试··还要麻烦您帮我再看看统计数目的程序哪里出了问题呢···谢啦

TOP

返回列表