免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Perl 求助
12下一页
最近访问板块 发新帖
查看: 4579 | 回复: 17
打印 上一主题 下一主题

求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-16 16:34 |只看该作者 |倒序浏览
我想把ATOM   3693  C81 FRG  
         ATOM   3694  N81 FRG
         ATOM   3707  C1   FRG
   替换成:
         ATOM   3707  C  FRG
         ATOM   3694  N  FRG
         ATOM   3707  C  FRG
也就是把后面的数字删了,perl 里面没有删除这样的操作,如何替换成空格啊,关键是不能当个匹配这样的数字????

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2014-04-16 16:43 |只看该作者
回复 1# 林间笑客

$ echo 'ATOM   3693  C81 FRG  
ATOM   3694  N81 FRG
ATOM   3707  C1   FRG' | perl -lape 's/(\D+)\d+\s+(\S+)\s*$/$1 $2/'
ATOM   3693  C FRG
ATOM   3694  N FRG
ATOM   3707  C FRG

   

论坛徽章:
1
巳蛇
日期:2014-04-17 12:33:24
3 [报告]
发表于 2014-04-16 19:21 |只看该作者
本帖最后由 iziang 于 2014-04-16 19:28 编辑

刚学Perl,献丑了

  1. perl -pe 's/\b([A-Z])\d+\b/$1/' sample
复制代码

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
4 [报告]
发表于 2014-04-16 20:06 |只看该作者
#!/usr/bin/perl
while(<DATA>)
{
chomp;
s/\b([A-Z])\d+\b/$1/;
print "$_\n";
}

__DATA__
ATOM  3693  C81  FRG
ATOM  3694  N81  FRG
ATOM  3707  C1  FRG



   

论坛徽章:
8
双子座
日期:2013-08-31 07:37:12金牛座
日期:2013-09-09 18:49:12处女座
日期:2013-09-23 11:43:14处女座
日期:2013-10-09 19:48:21狮子座
日期:2014-03-24 18:22:12丑牛
日期:2014-04-22 22:07:51申猴
日期:2014-06-12 21:54:13双鱼座
日期:2014-06-13 21:52:31
5 [报告]
发表于 2014-04-16 20:23 |只看该作者
  1. cat 1
  2. ATOM   3693  C81 FRG  
  3. ATOM   3694  N81 FRG
  4. ATOM   3707  C1   FRG
  5. $ perl -lane '$F[2]=~s/\d+//g;print "@F"' 1
  6. ATOM 3693 C FRG
  7. ATOM 3694 N FRG
  8. ATOM 3707 C FRG
  9. $
复制代码
回复 1# 林间笑客


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
6 [报告]
发表于 2014-04-16 20:26 |只看该作者
清泉一边 发表于 2014-04-16 20:06
#!/usr/bin/perl
while()
{


想想这种方法也不好,容易出现问题,还是用下面的方法吧
#!/usr/bin/perl
while(<DATA>)
{
chomp;
@all=split /\s+/,$_;
$all[2]=~s/\d//g;
print join(" ",@all),"\n";
}

__DATA__
ATOM  3693  C81  FRG
ATOM  3694  N81  FRG
ATOM  3707  C1  FRG

论坛徽章:
0
7 [报告]
发表于 2014-04-16 20:32 |只看该作者
回复 2# jason680


    是的,再描述下吧
  文件中99% 都是这样的行,
                                      

ATOM   3694 N81 FRG            52.020 -42.256 -71.305                       N   1476524726
ATOM   3695  O81 FRG            52.246 -43.459 -69.422                       O   1476524726
ATOM   3696  N82 FRG            52.693 -39.445 -67.776                       N   1476524726
ATOM   3697  C83 FRG            52.622 -41.106 -69.278                       C   1476524726
ATOM   3698  N83 FRG            53.623 -39.254 -68.752                       N   1476524726
ATOM   3699 C84 FRG            52.077 -40.536 -68.051                       C   1476524726
ATOM   3700 C85 FRG            53.561 -40.268 -69.664                       C   1476524726
ATOM   3701  C87 FRG            54.561 -38.198 -68.789                       C   1476524726
ATOM   3702  C91 FRG            50.977 -41.105 -67.241                       C   1476524726
ATOM   3703  F83 FRG            49.797 -41.052 -67.954                       F   1476524726
ATOM   3704  F84 FRG            50.897 -40.394 -66.073                       F   1476524726
ATOM   3705  F85 FRG            51.315 -42.396 -66.922                       F   1476524726
ATOM   3707 C1 FRG            48.712 -41.951 -75.402                       C   1666413310
ATOM   3708  C6  FRG            49.208 -42.806 -74.419                       C   1666413310
ATOM   3709 C7 FRG            49.322 -44.301 -74.331                       C   1666413310


删除带标记的 如第一行 N81 后面的81 这样的数字




就是将

论坛徽章:
0
8 [报告]
发表于 2014-04-16 20:56 |只看该作者
回复 4# 清泉一边


    谢谢,是可以的,当时存在一个问题,结果是
ATOM   3705  F FRG            51.315 -42.396 -66.922                       F   1476524726
ATOM   3707  C  FRG            48.712 -41.951 -75.402                       C   1666413310
ATOM   3708  C  FRG            49.208 -42.806 -74.419                       C   1666413310
ATOM   3709  C  FRG            49.322 -44.301 -74.331                       C   1666413310
ATOM   3710  O FRG            48.960 -45.073 -75.202                       O   1666413310
ATOM   3711  O  FRG            49.868 -44.694 -73.173                       O   1666413310


也就是说:本来原子名称后面是单个数字的,和双个数字的有很大差别,输出的时候会发生移位,能不能格式化输出?就是说输出的是
ATOM   3705  F FRG            51.315 -42.396 -66.922                       F   1476524726
ATOM   3707  C FRG            48.712 -41.951 -75.402                       C   1666413310
ATOM   3708  C FRG            49.208 -42.806 -74.419                       C   1666413310
ATOM   3709  C FRG            49.322 -44.301 -74.331                       C   1666413310
ATOM   3710  O FRG            48.960 -45.073 -75.202                       O   1666413310
ATOM   3711  O FRG            49.868 -44.694 -73.173                       O   1666413310


原子名称和后面的FRG 之间只有一个空格?

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
9 [报告]
发表于 2014-04-16 21:56 |只看该作者
明白了。你把代码中的\s换成\t应该就整洁了!回复 8# 林间笑客


   

论坛徽章:
1
羊年新春福章
日期:2015-04-28 20:40:58
10 [报告]
发表于 2014-04-16 21:58 |只看该作者
你用我在六楼写的代码吧,这个不会出现问题,你把print join(" ",@all),"\n";改成print join("\t",@all),"\n";就会变的整洁了,你看看可以吗。回复 8# 林间笑客


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP