LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 939|回复: 12

还是格式转换的问题

[复制链接]
发表于 2003-6-12 21:46:13 | 显示全部楼层 |阅读模式
>1auh_A mol:nucleic length:30     Rev Binding Element
GGUGGGCGCAGCUUCGGCUGACGGUACACC
>1auh_B mol:protein-het length:18     Rev Peptide
TRQARRNRRRRWRERQRX
>1avj_  mol:protein length:161     Calmodulin-Type Tch2 Protein
MSSKNGVVRSCLGSMDDIKKVFQRFDKNGDGKISVDELKEVIRALSPTASPEETVTMMKQFDLDGNGFIDLDEFV
ALFQIGIGGGGNNRNDVSDLKEAFELYDLDGNGRISAKELHSVMKNLGEKCSVQDCKKMISKVDIDGDGCVNFDE
FKKMMSNGGGA
>1awk_  mol:protein length:764     Adenylyl Cyclase
KIYIQRHDNVSILFADIVGFTGLASQCTAQELVKLLNELFGKFDELATENHCRRIKILGDCYYCVSGLTQPKTDH
上面的以>开始的那行如果是1avj_这种类型,就保持不变,如果是1auh_B这种类型,就变成1auhB,shell该怎么实现啊?多谢
发表于 2003-6-12 22:41:39 | 显示全部楼层
grep '1auh_B' filename|sed -n 's/1auh_B/1auhB/p'
 楼主| 发表于 2003-6-13 14:11:43 | 显示全部楼层
你那个只能替换1auh_B那一行啊,我那个文件有几万条这种数据该怎么办啊?
发表于 2003-6-13 14:46:49 | 显示全部楼层
grep '1auh_B' filename|sed -n 's/1auh_B/1auhB/pg'
那个g,就是全局替换的意思
 楼主| 发表于 2003-6-13 15:16:47 | 显示全部楼层
好象还是不行,你试一下下面的数据,把
1EFM_
1POU_
2AT2A
1ERP_
1BAL_
1HPBP
2CBH_
1SIS_
1GATA
7I1B_
1CDB_
变成
1EFM_
1POU_
2AT2_A
1ERP_
1BAL_
1HPB_P
2CBH_
1SIS_
1GAT_A
7I1B_
1CDB_
实际上数据有几万行
发表于 2003-6-13 15:20:19 | 显示全部楼层
我希望你还是先看看sed,awk,grep置顶的入门贴子吧~~,看明白啦,那渔就是你的
不管文件有多少行,
sed 's/aaa/bbb/g' urfile都可以办到,你要理解而不要照抄;)
 楼主| 发表于 2003-6-13 23:15:03 | 显示全部楼层
里面没看到有类似的功能啊?
sed 's/aaa/bbb/g' urfile确实可以把aaa替换为bbb,加个g表示全部替换,可我的文件里那个aaa各不相同,而bbb也随着变化啊,难道我要一个一个去替换??有没有可以定义一个模式,比如说[0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z][0-9,A-Z]替换为[0-9,a-z][0-9,a-z][0-9,a-z][0-9,a-z][_][0-9,A-Z]
发表于 2003-6-15 11:43:44 | 显示全部楼层
你可以写个脚本文件,把shell中的参数传递到sed中处理;)如:
urscript aaa filename
#
sed s/${1}/你希望的字符/g $2
其中,${1}为要替换的模式,$2是文件名.
 楼主| 发表于 2003-6-15 14:25:39 | 显示全部楼层
可是我希望替换的字符和替换模式有关啊,我真的不知道怎么搞定,希望大家指个明路,我现在急着要处理那一大堆数据,下面里一个文件里的部分数据:
1EFM_
1POU_
2AT2A
1ERP_
1BAL_
1HPBP
2CBH_
1SIS_
1GATA
7I1B_
1CDB_
数据都像上面的格式,我希望在找到2AT2A这样格式的行时,在最后一个子母前插个_,而像2CBH_这样的格式的行保持不变
结果是:
1EFM_
1POU_
2AT2_A
1ERP_
1BAL_
1HPB_P
2CBH_
1SIS_
1GAT_A
7I1B_
1CDB_
有谁能给个具体的shell啊,bow
发表于 2003-6-15 14:45:34 | 显示全部楼层
投机取巧的办法:做两次sed
你看看下面的就该明白了

$ sed -e 's/^..../&_/g' tempdata
1EFM__
1POU__
2AT2_A
1ERP__
1BAL__
1HPB_P
2CBH__
1SIS__
1GAT_A
7I1B__
1CDB__
fancyworld lucida $ sed -e 's/^..../&_/g' -e 's/__/_/g' tempdata
1EFM_
1POU_
2AT2_A
1ERP_
1BAL_
1HPB_P
2CBH_
1SIS_
1GAT_A
7I1B_
1CDB_
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表