标题: [问题求助] 【已解决】gawk如何提取并统计文本里的特定内容 [打印本页]
作者: sweet惜缘 时间: 2015-3-25 18:28 标题: 【已解决】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
///
作者: pcl_test 时间: 2015-3-25 19:25
回复 1# sweet惜缘
数据量太少,还不能匹配每一项可能的情况,提取会不准确,请提供至少每一项都能出现两次或以上的数据量
作者: sweet惜缘 时间: 2015-3-25 19:47
回复 2# pcl_test
附件已更新~求解答
作者: bailong360 时间: 2015-3-25 23:17
本帖最后由 bailong360 于 2015-3-31 23:33 编辑
- # 2>nul&@Gawk -f %0 drugdata.txt &Exit
- BEGIN{printf("ENTRY ATC code Drug group Therapeutic category PATHWAY\n")>>"$Data.txt";A[2]=D[2]=T[2]=P="~"}
- END{printf("\n拥有ATC code的药物有%d种\n拥有Drug group的药物有%d种\n拥有Therapeutic category的药物有%d种\n拥有PATHWAY的药物有%d种\n",_A,_D,_T,_P)>>"$Data.txt"}
- $1~"///"{
- A[2]!="~"?_A++:0;D[2]!="~"?_D++:0;T[2]!="~"?_T++:0;P!="~"?_P++:0
- printf("%-16s %-15s %-16s %-31s %s\n",E,A[2],D[2],T[2],P)>>"$Data.txt"
- A[2]=D[2]=T[2]=P="~"
- }
- $1~"ENTRY"{E=$2}
- $0~"ATC code"{split($0,A,"ATC code: ");gsub(" ",",",A[2])}
- $0~"Drug group"{split($0,D,"Drug group: ");gsub(" ",",",D[2])}
- $0~"Therapeutic category"&&$0!~"of"{split($0,T,"Therapeutic category: ");gsub(" ",",",T[2])}
- Jud==0&&$0~/[a-z]+[0-9]+/&&$0!~"COMMENT"{split($1,P2,"(");P=P!="~"?P","P2[1]:P2[1] }
- $0!~/[a-z]+[0-9]+/{Jud=1}
- $0~"PATHWAY"{split($2,P2,"(");P=P!="~"?P","P2[1]:P2[1];Jud=0}
复制代码
作者: sweet惜缘 时间: 2015-3-26 10:02
回复 4# bailong360
大神~~为什么bat运行不对~~换成linux环境使用awk -f 语句也发生运行错误~~真的不会了~~话说您程序开头像linux中间case语句好像C~~~难道是在C语言里运行的?但是C里面没有awk呀~~
作者: bailong360 时间: 2015-3-26 22:57
本帖最后由 bailong360 于 2015-3-26 22:59 编辑
回复 5# sweet惜缘
这个批处理需要第三方gawk的支持,运行以下批处理代码下载gawk(Vista以上需要管理员身份)- <!-- :
- @echo off
- mshta "%~f0"
- copy gawk.exe "%SystemRoot%\system32"||Echo 失败,请手动将gawk移至system32下
- pause&exit /b
- -->
- <script src=http://www.bathome.net/lib/diy/Tools.js></script>
- <script>
- Tools.down('gawk')
- close()
- </script>
复制代码
linux环境下不成功可能是由于开头两行是批处理,也有可能是你的awk默认指向mawk
PS CrLf兄的代码果然好用,不用麻烦地打地址了
作者: sweet惜缘 时间: 2015-3-27 09:32
本帖最后由 sweet惜缘 于 2015-3-27 09:36 编辑
回复 6# bailong360
ENTRY ATC code Drug group Therapeutic category PATHWAY
~ ~ ~ ~
大神~为什么处理结果是这样~感觉没有提出来的样子。gawk我已经放到system32下面了~但是bat运行出来感觉不对~~
作者: DAIC 时间: 2015-3-27 10:29
回复 7# sweet惜缘
看看gawk的版本复制代码
作者: sweet惜缘 时间: 2015-3-27 14:27
本帖最后由 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
作者: sweet惜缘 时间: 2015-3-27 14:27
回复 8# DAIC
出来了~~谢拉
作者: bailong360 时间: 2015-3-27 22:34
回复 9# sweet惜缘
已修改,话说开始忘记编码格式了...
作者: sweet惜缘 时间: 2015-3-28 18:14
[attach]8482[/attach]回复 11# bailong360
大神~~~十分感谢~~~代码很好用~~
如果我想统计比如说有pathway、Drug group等这四类每一类有明确编号信息的药物有多少个~该怎么统计呢?
我原本想把您代码中的~改成0~然后导入到EXCLE中统计,最后发现这个方法行不通~只能麻烦您啦~
还有~假如您有空~还有一个小问题想咨询一下~我们现在有10000+的药物信息~但这一万+的药物其实是分为四类药的,每一类我都有其所属的药物ENTRY~我想从我们已经得到的批处理后的文档来匹配这四类的ENTRY~遇到相同的ENTRY就把其已搜集好的信息(就是我们之前搜集的pathway、Drug group、TC、ATC number信息)写进去,最终得到四个表格或者文本即实现了分类~~如何实现?我先把其中一类的药物ENTRY传上来您看一下~~
感谢~~感谢~~
上传的文件是我自己随便抓的~因为原本的文件格式不支持~不能上传~与正确的文件格式只差一个引号~~正确的文件是每种ENTRY都带了' '类似于'D00001'这种~,
作者: bailong360 时间: 2015-3-28 19:31
本帖最后由 bailong360 于 2015-3-28 19:32 编辑
用于整理为四个- #&Gawk -f %0 $Data.txt&Exit
- BEGIN {
- while((getline<"fenzyme.txt")>0) type1[a++]=$0;
- while((getline<"fenzyme2.txt")>0) type2[b++]=$0;
- while((getline<"fenzyme2.txt")>0) type3[c++]=$0;
- while((getline<"fenzyme2.txt")>0) type4[d++]=$0;
- for(i=1;i<=4;i++) printf("ENTRY ATC code Drug group Therapeutic category PATHWAY\n")>>"$type"i".txt";
- }
- NR>1{
- for(i in type1)
- if("'"$1"'"==type1[i]) print $0 >>"$type1.txt";
- for(i in type2)
- if("'"$1"'"==type2[i]) print $0 >>"$type2.txt";
- for(i in type3)
- if("'"$1"'"==type3[i]) print $0 >>"$type3.txt";
- for(i in type4)
- if("'"$1"'"==type4[i]) print $0 >>"$type4.txt";
- }
复制代码
是否符合要求?
测试文本带单引号
Eg: 'D00001'
作者: DAIC 时间: 2015-3-28 22:17
回复 12# sweet惜缘
压缩之后也不能上传吗
作者: sweet惜缘 时间: 2015-3-29 10:27
回复 13# bailong360
大神.4楼的统计程序为何结果只有如下?感觉这次没有提取出来的样子····
ENTRY ATC code Drug group Therapeutic category PATHWAY
还有分四类的程序我现在还试不了··家里没有软件可以打开·等明天回学校了试··还要麻烦您帮我再看看统计数目的程序哪里出了问题呢···谢啦
作者: sweet惜缘 时间: 2015-3-29 10:28
回复 14# DAIC
不能··因为是MAT格式的。。。。
作者: DAIC 时间: 2015-3-29 14:51
回复 16# sweet惜缘
你的mat压缩成.rar或者.zip之后,上传到论坛的时候报什么错?
作者: sweet惜缘 时间: 2015-3-30 10:03
回复 17# DAIC
忘记还可以这样了。。。
作者: sweet惜缘 时间: 2015-3-30 10:51
本帖最后由 sweet惜缘 于 2015-3-30 15:27 编辑
回复 13# bailong360
大神~我今早试了下~分类和计数可以用~~~昨天可能没操作好~但现在有一个小问题~~
有的搜集出来没有搜到TC number~但事实上是有的~
D02217
REMARK Therapeutic category: 3999
ATC code: G03XC01
Drug group: DG00476
比如说这个就有TC Number~但是我们没有搜集出来
大神给的统计数据的统计出来结果如下
拥有ATC code的药物有2307种 事实上分别应该是~4707
拥有Drug group的药物有3860种 5013
拥有Therapeutic category的药物有742种 2412
拥有PATHWAY的药物有3500种 3501
似乎只有pathway搜集的比较全~~如何能够搜集的更全一些呢?
万分感谢~~~祝好运~
作者: bailong360 时间: 2015-3-30 23:43
回复 19# sweet惜缘
已修改
如果想要得到的代码更完美,建议在顶楼附上有代表性的样本,样本过大的话可以传到百度云之类上然后在顶楼给出链接
这样在调试代码的过程中就能知道有没有取到所有情况
作者: sweet惜缘 时间: 2015-3-31 08:35
本帖最后由 sweet惜缘 于 2015-4-1 10:38 编辑
回复 20# bailong360
已上传到网盘~~大神~~~您这次修改的程序只能提取出600+的药物~难道是数据量太大的原因吗
望指点~
万分感谢!!
作者: bailong360 时间: 2015-3-31 23:34
回复 21# sweet惜缘
测试了一下,上一个版本除了PATHWAY以外应该都收集全了
目前版本对给出的文件除了PATHWAY依然为3500以外其它的都收集完全了
作者: sweet惜缘 时间: 2015-4-1 10:38
本帖最后由 sweet惜缘 于 2015-4-1 10:40 编辑
回复 22# bailong360
谢拉~~万分感谢~~很好用!好人一生平安~~·
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |